我有一个存储过程,用于在给定月份内提取销售数据。 在31天的月份内,它不会返回31天。 我需要一些帮助来理解以下字符串的细分
(dateadd(dd,-(datepart(dd,getdate())),CONVERT(CHAR(8),GetDate(),112)))+'23:59:59')
我了解CONVERT(CHAR(8),GetDate(),112)
正在考虑系统日期并转换为YYYYMMDD
,而datepart(dd,getdate())
占用系统日期并仅占用当天的部分,但我无法解读整个字符串。
答案 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秒。