2014-01-25 47 views
3

我需要檢查我的日期是(例如)3月10日到4月20日,它應該在任何一年工作。 我對sql server非常陌生,在比較日期時發現了非常好的討論,但它們都包含了幾年,而且我不想對年份進行硬編碼。 這應該如何以一種整潔的方式完成?檢查兩個月之間的日期sql server

回答

3

您可以分別提取日期部分DAYMONTHYEAR。例如

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是否在一年(但任何一年)的兩個特定日期之間,您可以執行以下操作。

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

你可以用下面的辦法產生StartDateTime - StopDateTime範圍每年從Sales.SalesOrderHeader.OrderDate柱(我用AdventureWorks sample database:SQL2008 +)。這種方法是特區政府,能夠與上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年。

相關問題