簡體   English   中英

SQL 服務器:DATEDIFF 不准確

[英]SQL Server : DATEDIFF not accurate

我正在嘗試檢索兩個日期的月份差異,但似乎找不到獲得准確月份的方法。

以下是我到目前為止嘗試過的查詢:

SELECT DATEDIFF(month,convert(datetime, '11/05/2015'), convert(datetime, '12/06/2015')) - 1

這將導致 0 這是錯誤的,當我使用另一個日期時:

 SELECT DATEDIFF(month,convert(datetime, '12/31/2015'), convert(datetime, '01/01/2016')) - 1

這將產生 0,這是正確的。

閏年也必須考慮。

TSQL 將返回您編寫的正確結果。 正如您所擁有的,它取的是指定的兩個日期之間的月份差。

SELECT DATEDIFF(month, convert(datetime, '11/05/2015'), convert(datetime, '12/06/2015'))

11 月和 12 月之間的月差為“1”。

但是,如果您希望每 30 天的差異是 1 個月,那么您需要重寫您的查詢:

declare @daysPerMonth int = 30
SELECT (DATEDIFF(day, convert(datetime, '11/05/2015'), convert(datetime, '12/06/2015')) / @daysPerMonth)

如果您將一個月中的天數定義為 30,則此方法有效。

這是一種可視化DATEDIFF(month, ...)正在做什么的方法。 想想掛在牆上的月歷。 對於此特定 SQL 函數的目的,兩個日期之間的“月數”是從一個日期到下一個日期必須翻轉的頁數。 每個月有多少天或是否是閏年都無關緊要。

您不是第一個對內置函數的行為感到困惑的人。 如果您需要用不同的方法計算月份,那么您需要描述您想要完成的具體內容。 一旦您定義了需要解決的問題,很可能很容易創建解決方案。

在 T-SQL 中,您可以使用 CASE:

SELECT DATEDIFF(month, convert(datetime, '11/05/2015'),
convert(datetime, '12/06/2015')) - 
CASE 
WHEN (MONTH('11/05/2015') > MONTH('12/06/2015') 
OR MONTH('11/05/2015') = MONTH('12/06/2015')
AND DAY('11/05/2015') > DAY('12/06/2015')) 
THEN 1 ELSE 0 
END

哪個返回 1 是正確的,並且:


SELECT DATEDIFF(month, convert(datetime, '12/31/2015'),
convert(datetime, '01/01/2016')) - 
CASE 
WHEN (MONTH('12/31/2015') > MONTH('01/01/2016') 
OR MONTH('12/31/2015') = MONTH('01/01/2016')
AND DAY('12/31/2015') > DAY('01/01/2016')) 
THEN 1 ELSE 0 
END

哪個返回 0 是正確的。

declare 
    @start date = '20220105',
    @end date = '20220406'

select 'Date_Diff_In_3 months' = 
    case 
     when datediff(month, @start, @end) < 3 
        or (datediff(month, @start, @end) = 3 and day(@start) >= day(@end))
        then 'yes' 
        else 'no' 
    end

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM