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 return 是您编写的正确结果。正如您所拥有的,它正在计算指定的两个日期之间的月份差。
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 函数的目的,两个日期之间的月数 "number" 是从一个日期到下一个日期必须翻动的页数。每个月有多少天或是否是闰年都没有关系。
您不是第一个对内置函数的行为感到困惑的人。如果您需要用不同的方法计算月份,那么您需要描述您想要完成的具体内容。一旦您定义了需要解决的问题,很可能很容易创建解决方案。
在 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
哪个 returns 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
哪个returns 0哪个是正确的。
我正在尝试检索两个日期的月份差异,但似乎找不到获得准确月份的方法。
以下是我到目前为止尝试过的查询:
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 return 是您编写的正确结果。正如您所拥有的,它正在计算指定的两个日期之间的月份差。
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 函数的目的,两个日期之间的月数 "number" 是从一个日期到下一个日期必须翻动的页数。每个月有多少天或是否是闰年都没有关系。
您不是第一个对内置函数的行为感到困惑的人。如果您需要用不同的方法计算月份,那么您需要描述您想要完成的具体内容。一旦您定义了需要解决的问题,很可能很容易创建解决方案。
在 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
哪个 returns 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
哪个returns 0哪个是正确的。