저장 프로 시저에 월과 연도를 부여하고 그 달에 발생한 모든 일을 반환하도록하고 싶습니다. 어떤 달에는 일 수가 다르기 때문에 비교할 수 없기 때문에 어떻게해야합니까?
이를 수행하는 가장 좋은 방법은 무엇입니까? 연도와 월을 기준으로 비교를 요청할 수 있습니까?
감사.
답변:
나는 당신이 찾고있는 기능이라고 생각합니다 MONTH(date). 'YEAR' 도 사용하고 싶을 것입니다 .
다음 things과 같은 이름의 테이블이 있다고 가정 해 보겠습니다 .
id happend_at
-- ----------------
1 2009-01-01 12:08
2 2009-02-01 12:00
3 2009-01-12 09:40
4 2009-01-29 17:55
happened_at2009/01 월 (2009 년 1 월) 동안 a가있는 모든 레코드를 찾기 위해 실행하려고한다고 가정 해 보겠습니다 . SQL 쿼리는 다음과 같습니다.
SELECT id FROM things
WHERE MONTH(happened_at) = 1 AND YEAR(happened_at) = 2009
다음을 반환합니다.
id
---
1
3
4
대부분의 응답에서 제안 된대로 MONTH 및 YEAR 함수를 사용하면 SQL Server가 날짜 열에있을 수있는 인덱스를 사용할 수 없다는 단점이 있습니다. 이것은 큰 테이블에서 성능을 저하시킬 수 있습니다.
관심있는 달의 첫 번째 날을 나타내는 저장 프로 시저에 DATETIME 값 (예 : @StartDate)을 전달하고 싶습니다.
그런 다음 사용할 수 있습니다.
SELECT ... FROM ...
WHERE DateColumn >= @StartDate
AND DateColumn < DATEADD(month, 1, @StartDate)
저장 프로 시저에 별도의 매개 변수로 월과 연도를 전달해야하는 경우 CAST 및 CONVERT를 사용하여 월의 첫 번째 날을 나타내는 DATETIME을 생성 한 다음 위와 같이 진행할 수 있습니다. 이렇게하면 정수 연도, 월, 일 값에서 DATETIME을 생성하는 함수를 작성하는 것이 좋습니다. 예를 들어 SQL Server 블로그 의 다음과 같습니다 .
create function Date(@Year int, @Month int, @Day int)
returns datetime
as
begin
return dateadd(month,((@Year-1900)*12)+@Month-1,@Day-1)
end
go
그러면 쿼리는 다음과 같이됩니다.
SELECT ... FROM ...
WHERE DateColumn >= Date(@Year,@Month,1)
AND DateColumn < DATEADD(month, 1, Date(@Year,@Month,1))
@EndDate하면 명시 적으로 표시됩니다.
더 많은 팁이 매우 간단합니다. to_char 함수를 사용할 수도 있습니다 .
한 달 동안 :
to_char (happened_at, 'MM') = 01
to_char (happened_at, 'YYYY') = 2009
to_char (happened_at, 'DD') = 01
to_char 함수는 하나의 특정 데이터베이스가 아닌 SQL 언어로 지원됩니다.
더 많은 사람을 돕길 바랍니다 ...
복근!
SQL Server를 사용하는 경우 DATEPART를 살펴보십시오.
http://msdn.microsoft.com/en-us/library/ms174420(SQL.90).aspx
DATEPART (mm, [보고있는 날짜])
그런 다음 일반 정수 논리를 사용할 수 있습니다. 연도와 동일하며 mm 대신 yy를 사용하십시오.
연도와 월을 기준으로 비교를 요청할 수 있습니까?
할 수 있습니다. 다음은 AdventureWorks 샘플 데이터베이스를 사용하는 간단한 예입니다.
DECLARE @Year INT
DECLARE @Month INT
SET @Year = 2002
SET @Month = 6
SELECT
[pch].*
FROM
[Production].[ProductCostHistory] pch
WHERE
YEAR([pch].[ModifiedDate]) = @Year
AND MONTH([pch].[ModifiedDate]) = @Month
나는 쉽게 (예 : 시간 데이터 형식으로 값을 전달 찾을 DATETIME후 특히, 시간 기능을 사용) DATEADD및 DATEPART이 경우에 달이 발견을 시작 날짜와 종료 날짜 쌍을 예, 기간의 시작 및 종료 날짜를 찾기 위해, 이번 달의 경우 CURRENT_TIMESTAMP매개 변수 유형으로 대체 DATETIME하십시오 (1990-01-01 값은 완전히 임의적 임).
SELECT DATEADD(M,
DATEDIFF(M, '1990-01-01T00:00:00.000', CURRENT_TIMESTAMP),
'1990-01-01T00:00:00.000'),
DATEADD(M,
DATEDIFF(M, '1990-01-01T00:00:00.000', CURRENT_TIMESTAMP),
'1990-01-31T23:59:59.997')
SELECT * FROM yourtable WHERE yourtimestampfield LIKE 'AAAA-MM%';
AAAA원하는 연도와 MM원하는 달은 어디에 있습니까?