查询以获取不使用 DATEADD 的月份的第一天

Query to get the first day of the month not working with DATEADD

我多年来一直在编写查询以截断给定日期时间的时间,基于 this one and this one(以及许多其他地方)之类的答案,将几个函数分组,例如

SELECT DATEADD(day, 0, DATEDIFF(day, 0, getdate()))

它总能给出正确答案。

我想我可以通过使用 month 而不是 day 将相同的逻辑转换为查找当前月份的第一天,但​​它给了我一个奇怪的结果日期:1903-10-17,而不是 2015-05-01.

我的参数总是顺序不对

事实证明,这些年来我一直在使用的 DATEADD 的格式是错误的,它一直有效是因为它使用了 day 日期部分。将 int 转换为日期会增加日期:

SELECT CAST(0 AS datetime) = '1900-01-01 00:00:00.000'
SELECT CAST(1 AS datetime) = '1900-01-02 00:00:00.000'
SELECT CAST(2 AS datetime) = '1900-01-03 00:00:00.000'

我应该使用 DATEADD(d, DATEDIFF(d, 0, getdate()), 0) - 参数为 (datepart, number, date),如下所示 here at MSDN

写成 SELECT DATEADD(month, DATEDIFF(month, 0, getdate()), 0) 给出 2015-05-01.

的预期结果