2014-01-25 3 views
3

날짜가 3 월 10 일에서 4 월 20 일 사이인지 확인해야하며 어느 해에 작동해야합니다. 저는 SQL Server를 처음 접해 보았습니다. 날짜 비교에 대한 훌륭한 토론이있었습니다. 그러나 모두 수년이 걸렸으므로 올해를 하드 코딩하고 싶지는 않습니다. 어떻게 이것이 깔끔한 방식으로 이루어져야합니까?두 달 사이의 날짜 확인 SQL 서버

답변

3

DAY, MONTHYEAR의 날짜 부분을 각각 추출 할 수 있습니다. 예 :

Select MONTH(GETDATE()) 

현재 날짜의 월 번호를 알려줍니다.

한 달에 삽입을하기 전에 특정 값 사이에 있는지 확인하려면 다음

If Exists (Select 'x' Where Month(GETDATE()) Between 3 and 4 --March to April 
Begin 
    --Do work here 
End 

CreatedDate 두 값 사이에 어디 테이블에서 모든 값을 얻고 싶다면 :

Select * 
From MyTable 
Where MONTH(CreatedDate) Between 3 and 4 -- March to April 

마지막으로, CreatedDate가 1 년 (그러나 1 년)의 두 특정 날짜 사이에 있는지 확인하려면 다음을 수행 할 수 있습니다. 당신은 StartDateTime 생성 방법 다음 사용할 수

Select * 
From MyTable 
Where CreatedDate Between Convert(Varchar, YEAR(CreatedDate)) + '-03-12' 
     and Convert(Varchar, YEAR(CreatedDate)) + '-03-15' 
1

아마 짧은 방법이 있습니다,하지만 당신은

SELECT * 
FROM your table 
--this will transform your date in a varchar with 2 digits for month and 2 digits for day 
WHERE RIGHT('0' + RTRIM(CAST (MONTH(<yourdatefield>) as varchar(2))), 2) + 
     RIGHT('0' + RTRIM(cast(DAY(<yourdatefield>) as varchar(2))), 2) 

BETWEEN '0310' and '0410' 

SqlFiddle

를 참조 할 수
0

-Sales.SalesOrderHeader.OrderDate 열에서 매년 StopDateTime 범위는 (내가 AdventureWorks sample database 사용했습니다 : SQL2008의 +). 이 방법은 SARG-수 있으며, OrderDate 열에 인덱스와 마지막 SELECT 문에 대한 실행 계획은 Index Seek 포함됩니다

CREATE INDEX IN_SalesOrderHeader_OrderDate 
ON Sales.SalesOrderHeader(OrderDate); 
GO 

DECLARE @StartDay TINYINT, 
    @StartMonth TINYINT, 
    @StopDay TINYINT, 
    @StopMonth TINYINT; 

SELECT @StartDay = 10, 
    @StartMonth = 3, 
    @StopDay = 20, 
    @StopMonth = 4; 

DECLARE @FirstYear SMALLINT, @LastYear SMALLINT; 
SELECT TOP(1) @FirstYear = YEAR(h.OrderDate) 
FROM Sales.SalesOrderHeader h  
WHERE h.OrderDate IS NOT NULL 
ORDER BY h.OrderDate ASC; 

SELECT TOP(1) @LastYear = YEAR(h.OrderDate) 
FROM Sales.SalesOrderHeader h  
WHERE h.OrderDate IS NOT NULL 
ORDER BY h.OrderDate DESC; 

WITH N10(Num) 
AS 
(
    SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL 
    SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9 UNION ALL SELECT 10 
), N100(Num) 
AS 
(
    SELECT (a.Num - 1)*10 + b.Num 
    FROM N10 a CROSS JOIN N10 b 
) 
SELECT COUNT(z.SalesOrderID) AS SalesOrderCount 
FROM 
(
    SELECT x.CurrentYear, 
     StartDateTime = DATEADD(DAY, @StartDay-1, DATEADD(MONTH, @StartMonth-1, DATEADD(YEAR, x.CurrentYear - 1900, 0))), 
     StopDateTime = DATEADD(DAY, @StopDay/*-1*/, DATEADD(MONTH, @StopMonth-1, DATEADD(YEAR, x.CurrentYear - 1900, 0))) 
    FROM 
    (
     SELECT @FirstYear + n.Num - 1 AS CurrentYear 
     FROM N100 n 
     WHERE n.Num <= (@LastYear - @FirstYear + 1) 
    ) x 
) y 
CROSS APPLY 
(
    SELECT h.SalesOrderID 
    FROM Sales.SalesOrderHeader h 
    WHERE h.OrderDate >= y.StartDateTime 
    AND  h.OrderDate < y.StopDateTime 
) z 

실행 계획 :

enter image description here

참고 :이 솔루션을 Sales.SalesOrderHeader.OrderDate 열에 최대 100 년이 있다고 가정합니다.