我试图了解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个月。有人可以解释发生了什么事吗?
答案 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
作为输出。