为什么DATEDIFF返回-1

时间:2019-05-15 14:15:17

标签: sql-server tsql date

我试图了解DATEDIFF函数在SQL Server中的工作方式。以下T-SQL返回-1:

SELECT DATEDIFF(MONTH, 2015-10-25, 2015-12-27)

但是,ending_date在start_date之后,因此我希望它是正数,而不是负数。此外,我希望10月25日和12月27日之间的差异为2个月。而是,SQL Server返回-1个月。有人可以解释发生了什么事吗?

4 个答案:

答案 0 :(得分:5)

您缺少撇号:

SELECT  2015-10-25 AS First, 
        2015-12-27 AS Second,
        CAST(2015-10-25 As DateTime) AS [First as datetime],
        CAST(2015-12-27 As DateTime) AS [Second as datetime],
        DATEDIFF(MONTH, 2015-10-25, 2015-12-27) AS WrongResult,
        DATEDIFF(MONTH, '2015-10-25', '2015-12-27') AS CorrectResult

结果:

First   Second  First as datetime       Second as datetime      WrongResult CorrectResult
1980    1976    04.06.1905 00:00:00     31.05.1905 00:00:00     -1          2

SQL Server将2015-10-25视为一个整数-数学表达式(1980)的结果。
int函数中使用datetime会导致SQL Server将int值隐式转换为DateTime值。
int值表示自'1900-01-01'以来的天数-由于第二个参数的int值较小,因此您会得到负数。

就像耶罗恩·莫斯特(Jeroen Mostert)在评论中所写的那样-这些书的陷阱。

答案 1 :(得分:5)

您没有引用日期,这意味着您的表达式的计算结果为:

.
.
.
import { MatDialogModule } from '@angular/material';
.
.
.
@NgModule({
  imports: [  
    MatDialogModule,

  ],


隐式转换为日期时间后的结果为:

SELECT DATEDIFF(MONTH, 1980, 1976)

所以现在开始日期在结束日期之后。

答案 2 :(得分:2)

因为您使用的是数字(特别是整数),而不是字符串。 2015-10-25 = 1980,当您转换为日期时为'1905-06-04'。另一方面,日期为2015-12-27 = 1976的{​​{1}}。由于'1905-05-31''1905-05-31'早一个月,因此结果为-1。

使用文字字符串和'1905-06-04'日期:

yyyyMMdd

答案 3 :(得分:1)

将日期值放在单引号内。

查询

SELECT DATEDIFF(MONTH, '2015-10-25', '2015-12-27');

此查询返回2作为输出。