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