![](/img/trans.png)
[英]What is the most accurate way of using DATEDIFF in SQL Server?
[英]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.