sql日期比較 - sql計算月數




僅基於月份和年份的SQL Server日期比較 (3)

我無法確定僅基於月和年來比較SQL日期的最佳方法。

我們根據日期進行計算,由於計費按月進行,因此每月的日期造成了更多的障礙。

例如

DECLARE @date1 DATETIME = CAST('6/15/2014' AS DATETIME),
        @date2 DATETIME = CAST('6/14/2014' AS DATETIME)

SELECT * FROM tableName WHERE @date1 <= @date2

上面的例子不會返回任何行,因為@ date1大於@ date2。 所以我想找出一個辦法來排除這個問題。

同樣,下面的情況也出於同樣的原因讓我感到悲傷。

DECLARE @date1 DATETIME = CAST('6/14/2014' AS DATETIME),
        @date2 DATETIME = CAST('6/15/2014' AS DATETIME),
        @date3 DATETIME = CAST('7/1/2014' AS DATETIME)

SELECT * FROM tableName WHERE @date2 BETWEEN @date1 AND @date3

我已經完成日期的內聯轉換,以獲得指定日期的月份的第一天和最後一天。

SELECT * 
FROM tableName 
WHERE date2 BETWEEN
    DATEADD(month, DATEDIFF(month, 0, date1), 0) -- The first day of the month for date1
    AND
    DATEADD(s, -1, DATEADD(mm, DATEDIFF(m, 0, date2) + 1, 0)) -- The lastday of the month for date3

必須有一個更簡單的方法來做到這一點。 有什麼建議麼?


您可以加入這些日期的MONTHYEAR值:

SELECT * 
FROM tableName 
WHERE YEAR(@date1) = YEAR(@date2) AND MONTH(@date1) = MONTH(@date2)

您可以將給定日期的月份和年份過濾到當前日期,如下所示:

SELECT * 
FROM tableName 
WHERE month(date2) = month(getdate()) and year(date2) = year(getdate())

只需將GETDATE()方法替換為所需的日期即可。


首先,我使用明確的日期格式,比如標準的'YYYYMMDD'而不是你已經使用的'6/15/2014' 。 Aaron Bertrand的博客解釋得比我想像的要好得多,可能會出現這樣的錯誤:
不好的習慣踢:錯誤處理日期/範圍查詢

對於特定的問題,您最後一次查詢找到月份的第一天和最後一天(對於date1和date3),在我看來是正確的。 你只需要幾個月的頭幾天(日期1的第一天和日期3的下個月的第一天),如果你避免了邪惡之間BETWEEN和魔鬼有什麼共同點?

SELECT * 
FROM tableName 
WHERE date2 >= DATEADD(month, DATEDIFF(month, '19000101', @date1), '19000101')
  AND date2 < DATEADD(month, 1+DATEDIFF(month, '19000101', @date3), '19000101') ;

查詢按原樣運行,不管date2DATEDATETIMEDATETIME2SMALLDATTEIME )的數據類型如何。

獎金點, date2索引將被優化器這樣考慮。

根據Aaron的博客文章(另一篇文章)的改進,為了避免使用DATEDIFF()表達式時的基數估計問題:
性能驚喜和假設:DATEDIFF

SELECT * 
FROM tableName 
WHERE date2 >= CONVERT(DATE, DATEADD(day, 1 - DAY(@date1), @date1))
  AND date2 < DATEADD(month, 1, 
                      CONVERT(DATE, DATEADD(day, 1 - DAY(@date3), @date3))) ;






date