Dateadd在本月返回错误的日子

时间:2015-08-07 21:21:36

标签: sql-server dateadd

我有一个存储过程,用于在给定月份内提取销售数据。 在31天的月份内,它不会返回31天。 我需要一些帮助来理解以下字符串的细分

(dateadd(dd,-(datepart(dd,getdate())),CONVERT(CHAR(8),GetDate(),112)))+'23:59:59')

我了解CONVERT(CHAR(8),GetDate(),112)正在考虑系统日期并转换为YYYYMMDD,而datepart(dd,getdate())占用系统日期并仅占用当天的部分,但我无法解读整个字符串。

2 个答案:

答案 0 :(得分:0)

您提供的表达方式存在问题。 23:59:59之后的括号没有左括号。

然而,表达式打算做的是: (datepart(dd,getdate()))正在获取当前日期

CONVERT(CHAR(8),GetDate(),112))获取当前日期YYYMMDD

(dateadd(dd,-(datepart(dd,getdate())),CONVERT(CHAR(8),GetDate(),112)))从今天的日期减去日期部分(参见负号)。

因此它试图获得当月的第一天。如果上述表达式的结果超过了上个月的最后一天,则会增加23小时59分钟。

逻辑可能是为了获得上个月的最后一天。这增加约24小时就会造成混乱。

答案 1 :(得分:0)

这会帮助你:

declare @First datetime = dateadd(month,datediff(month,0,getdate()),0)
declare @Last  datetime = dateadd(second,-1,dateadd(month,datediff(month,0,getdate())+1,0))

@First检查从零开始到现在的月数,然后将这个月数添加到ZERO,以便为您提供本月的第一个时刻。

@Last的工作方式类似,但是为了给你下个月的第一个时刻增加了一个月到ZERO的月数,然后从那个日期减去1秒,给你最后一天的最后一天一个月。

如果您需要转到MS,您可以将最后一位更改为减去3毫秒而不是1秒。