Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server:DATEDIFF不准确_Sql Server_Sql Server 2005 - Fatal编程技术网

Sql server SQL Server:DATEDIFF不准确

Sql server SQL Server:DATEDIFF不准确,sql-server,sql-server-2005,Sql Server,Sql Server 2005,我试图检索两个日期的月差,但似乎找不到获得准确月份的方法 以下是我到目前为止尝试的查询: 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'))

我试图检索两个日期的月差,但似乎找不到获得准确月份的方法

以下是我到目前为止尝试的查询:

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中,您可以使用以下用例:

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,这是正确的。

Datediff
当日期边界(
)跨越时计数。在使用
Datediff
时,您需要小心。您的期望值是什么?我认为第二个值也应该将差值计算为1,然后减去0。它们都是一样的。这两个表达式对我来说都是0。你确定第二个结果是1吗?不管怎样,函数完全按照描述工作,现在由您来描述您想要的功能。@GiorgiNakeuri我希望得到准确的月份,考虑到所有可能的条件(闰年等)。hi@Greg感谢您的回答,考虑到这些数据,1992年2月1日和1992年3月1日,如果你计算的天数少于30天,但如果我们以月为单位来看,这被认为是一个月,今年是闰年是的,你能解释一下你的观点吗?就月数差异而言,为1。就daysPerMonths而言,如果您每月使用30天,那么它是0。当使用month作为datediff时,它会忽略日期。2月1日,2月18日,2月29日。。。按月份计算,2月份和3月份一样。因此,无论是哪一天,2月和3月之间的月差都是1。