SQL Ce-返回上个月的查询不起作用
我使用了一个查询,这里的某个人向我提供了一个查询,以获取当前日期之前的结果,该查询非常有效:SQL Ce-返回上个月的查询不起作用,sql,datetime,sql-server-ce,Sql,Datetime,Sql Server Ce,我使用了一个查询,这里的某个人向我提供了一个查询,以获取当前日期之前的结果,该查询非常有效: WHERE IssuedOn >= DATEDIFF(D, 1, GETDATE()) and IssuedOn < DATEDIFF(D, 0, GETDATE()) "; 其中IssuedOn>=DATEDIFF(D,1,GETDATE())和IssuedOn
WHERE IssuedOn >= DATEDIFF(D, 1, GETDATE()) and IssuedOn < DATEDIFF(D, 0, GETDATE()) ";
其中IssuedOn>=DATEDIFF(D,1,GETDATE())和IssuedOn
我认为在上个月,将D改为M就足够了,但显然我遗漏了一些东西:
WHERE IssuedOn >= DATEDIFF(M, 1, GETDATE()) and IssuedOn < DATEDIFF(M, 0, GETDATE()) ";
其中IssuedOn>=DATEDIFF(M,1,GETDATE())和IssuedOn
这是行不通的。我需要返回从当前日期起上个月发出的行。简短回答: 以下SQL将获取日期范围的值:
-- The beginning of the current month
DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0)
-- The beginning of the previous month
DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE())-1, 0)
-- The beginning of the next month
DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE())+1, 0)
您可以用任何其他值替换MONTH
,以获取年、小时、天等的日期范围
长答案:
日查询有效而月查询无效的原因是SQL Server将DATETIME
对象存储为FLOAT
s。整数部分,表示自1900-01-01 00:00:00.000起的日期(以下简称“0”)。表示时间的小数部分(以24小时的百分比表示)
如果您调用DATEDIFF(DAY,0,GETDATE())
,它将获得自“0”以来的天数,这基本上与将GETDATE()
的浮点表示转换为整数
表示相同(截断分钟,在00:00离开您)。例如,如果我今天运行selectcast(GETDATE()作为FLOAT)
,我会得到“41675.3452306327”。如果我运行选择DATEDIFF(DAY,0,GETDATE())
,我会得到“41675”
如果调用DATEDIFF(MONTH,0,GETDATE())
,您将得到自“0”起的月数。今天,这给了我“1369”。如果您尝试将该值与DATETIME
进行比较,它将简单地将“1369”转换为DATETIME
,将其视为“0后1369天”,并导致DATETIME
为“1903-10-02 00:00:00.000”。要亲自查看,请尝试:选择CAST(DATEDIFF(MONTH,0,GETDATE())作为DATETIME)
如果要从DATETIME
中删除日期(和时间戳),需要获取DATEDIFF
查询的结果,并使用DATEDIFF
函数将其添加回“0”,如下所示:
DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0)
DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE())+1, 0) -- Get the next month
这基本上是以日期(月份)为基础,计算出自“0”以来已经过去了多少个月,然后将月数添加到“0”。简而言之,它返回一个表示当前月份开始的DATETIME
如果要获取上一个月或下一个月的数据,可以在将DATEDIFF
函数返回的值传递到DATEADD
调用之前,简单地减少或增加该值,如下所示:
DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0)
DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE())+1, 0) -- Get the next month
“从当前日期算起的前一个月”是指“从今天算起的一个月前”(即2014年1月7日至2014年2月7日)还是“上个月的任何时间”(即2014年1月1日至2014年1月31日)?根据您对下面另一个答案的回答,您似乎是指第二个答案(“上个月的任何时间”)。对不起,是-我的意思是当月数为当前值-1时。如果是这种情况,您应该能够将我答案中的函数插入到WHERE
子句中,以获得适当的范围。希望“长答案”能提供一些信息,说明您最初的尝试不起作用的原因,以及DAY
尝试起作用的原因。谢谢,它非常详细,但我对SQL不太熟练,不知道如何在我的WHERE条件下使用它。顶部的不同函数(在“短答案”部分)可用于检索您所在范围的特定日期。基本上更新您的WHERE
子句,以检查IssuedOn>=“上个月”和IssuedOn
。最后它开始工作了,谢谢!只是一个问题,就今年而言,Y是否也一样?是的,这是正确的。我在“简短回答”的底部有一个注释提到了这一点。上面的函数调用可以用来将日期“截断”到任何精度。我觉得非常愚蠢,尝试了IssuedOn>=DATEADD(Y,DATEDIFF(Y,0,GETDATE())-1,0)和IssuedOn