我正在尝试理解下面的T-SQL代码:
select DATEADD( MONTH, DATEDIFF( MONTH, -1, GETDATE()) -1, -1)
传入DATEDIFF时-1表示什么?根据this,它应该是一个日期参数。
u5rb5r591#
在这里,DATEDIFF的第二个参数x1m0 n1 a和DATEADD的第三个参数x1m0 n1 a将隐式转换为datetime。您可以使用一个简单的表达式找到该值:
DATEDIFF
DATEADD
datetime
SELECT CONVERT(datetime, -1);
这表示1899-12-31 00:00:00.000。对于“旧”日期和时间数据类型((small)datetime),它们允许从数值数据类型(如int或decimal)进行转换。0表示1900-01-01 00:00:00,每个全整数值表示一天。因此-1表示1899-12-31 00:00:00.000,2表示1900-01-03 00:00:00.000,5.5表示1900-01-06 12:00:00.000(因为.5表示12小时)。对于 new 日期和时间数据类型,不存在此转换。事实上,上面的内容可能更容易写成下面的形式:
(small)datetime
int
decimal
0
-1
2
5.5
.5
SELECT EOMONTH(GETDATE(),-1);
这里,-1表示第一个参数日期前1个月的月末EOMONTH的第二个参数是可选的,因此EOMONTH(GETDATE())将返回当前月份的最后一天,而EOMONTH(GETDATE(),2)将返回2个月时间(撰写时为2023年3月31日)内的最后一天。
EOMONTH
EOMONTH(GETDATE())
EOMONTH(GETDATE(),2)
1条答案
按热度按时间u5rb5r591#
在这里,
DATEDIFF
的第二个参数x1m0 n1 a和DATEADD
的第三个参数x1m0 n1 a将隐式转换为datetime
。您可以使用一个简单的表达式找到该值:这表示1899-12-31 00:00:00.000。对于“旧”日期和时间数据类型(
(small)datetime
),它们允许从数值数据类型(如int
或decimal
)进行转换。0
表示1900-01-01 00:00:00,每个全整数值表示一天。因此-1
表示1899-12-31 00:00:00.000,2
表示1900-01-03 00:00:00.000,5.5
表示1900-01-06 12:00:00.000(因为.5
表示12小时)。对于 new 日期和时间数据类型,不存在此转换。
事实上,上面的内容可能更容易写成下面的形式:
这里,
-1
表示第一个参数日期前1个月的月末EOMONTH
的第二个参数是可选的,因此EOMONTH(GETDATE())
将返回当前月份的最后一天,而EOMONTH(GETDATE(),2)
将返回2个月时间(撰写时为2023年3月31日)内的最后一天。