我有一个表,其中有一个名为StartDateTime
的列,用于存储日期时间值。我需要一份声明,它将返回当前记录上个月第一天的日期。因此,如果存储的日期为2006-06-17 08:23:42.000
,则语句将返回2006-05-01 00:00:00.000
,重要的是,如果存储的日期为2006-01-17 08:23:42.000
,则语句将返回2005-11-1 00:00:00.000
如果我可以使用DATEBYPARTS
,这似乎很简单,但不幸的是我做不到。
我尝试使用
CAST(
CAST( Year([StartDateTime]) as varchar(4) )
+ '-' +
CAST( (Month([StartDateTime])-1) as varchar(2) )
+ '-' +
CAST( '1' as varchar(2) )
AS DATETIME )
但它在1月1日的日期出错,并给出错误“将char数据类型转换为日期时间数据类型会导致超出范围的日期时间值。”
答案 0 :(得分:5)
select dateadd(mm, datediff(mm, 0, StartDateTime) - 1, 0)
from <yourtable>
或者,正如Aaron Bertrand在评论中提出的那样,更明确的方式
select dateadd(month, datediff(month, 0, StartDateTime) - 1, 0)
from <yourtable>