SQL查询减去1个月

时间:2016-06-20 15:58:42

标签: sql dateadd

我需要查询SQL以查找属于上个月日期的数据。我以为我正在使用正确的查询逻辑,但我没有得到任何结果,我知道有结果。代码片段是这样的:

MONTH(n.JOIN_DATE) = DATEADD(month, - 1, GETDATE())

这没有给我任何结果,我需要得到任何加入日期为上个月的人。我错过了什么?

7 个答案:

答案 0 :(得分:3)

使用此:

MONTH(n.JOIN_DATE) = MONTH(DATEADD(month, - 1, GETDATE()))

你需要比较苹果和苹果,所以比较等式两边的数字月份。

在我做之前,我已经非常感谢@PaulL解决了这个问题。

<强>更新

正如@DasBlinkenLight和Matt所指出的那样,只需按月比较,就可以将门打开多年。一种可能的解决方法是比较年份,例如

WHERE MONTH(n.JOIN_DATE) = MONTH(DATEADD(month, - 1, GETDATE())) AND
      YEAR(n.JOIN_DATE) = YEAR(DATEADD(month, - 1, GETDATE()))

答案 1 :(得分:1)

MONTH(n.JOIN_DATE)只会返回月份的数值(例如:115)。

DATEADD(MONTH, -1, GETDATE())只会从当前日期减去一个月。它仍然是DATETIME格式。

您可能正在寻找:

MONTH(n.JOIN_DATE) = MONTH(DATEADD(MONTH, -1, GETDATE()))

答案 2 :(得分:1)

MONTH(...)生成一个月号。您不应将其与DATEADD返回的结果进行比较,WHERE DATEADD(month, 1, n.JOIN_DATE) > GETDATE() 实际上是一个日期。

如果您正在寻找不到一个月前加入的所有人,您可以这样做:

WHERE MONTH(DATEADD(month, -1, GETDATE()) = MONTH(n.JOIN_DATE)
  AND YEAR (DATEADD(month, -1, GETDATE()) = YEAR (n.JOIN_DATE)

这也考虑了年份和日期,而不仅仅是月份。

如果您正在寻找上个月加入的所有人,无论在哪一天,您都可以使用更复杂的条件:

item.css("table+ table tr+ tr").each do |type_price|

第二个条件是必要的,以避免上个月加入的成员与一年或多年前在同一个月加入的成员之间产生混淆。

答案 3 :(得分:1)

MONTH(n.JOIN_DATE) returns a numeric which indicate the month in date m.JOIN_DATE
DATEADD(month, - 1, GETDATE()) returns a date which indicate date in last month.
So, you can use this instead :
MONTH(n.JOIN_DATE)= MONTH(DATEADD(month, - 1, GETDATE()))
OR
n.JOIN_DATE = DATEADD(month, - 1, GETDATE())

答案 4 :(得分:0)

SELECT
    DATEFROMPARTS(YEAR(DATEADD(month,-1,GETDATE())),MONTH(DATEADD(month,-1,GETDATE())),1) AS StartOfLastMonth
    ,DATEADD(day,-1,(DATEFROMPARTS(YEAR(GETDATE()),MONTH(GETDATE()),1))) AS EndOfLastMonthAsDate
    ,DATEADD(day,-3,CAST(DATEFROMPARTS(YEAR(GETDATE()),MONTH(GETDATE()),1) AS DATETIME)) AS EndOfLastMonthMidngith
    ,CAST(DATEADD(month,-1,GETDATE()) AS DATE) AS OneMonthAgoStrartOfDay
    ,CAST(GETDATE() AS DATE) AS StartOfToday
    ,DATEADD(MS,-3,CAST(CAST(GETDATE() AS DATE) AS DATETIME)) AS MidnightLastNight

好的,因为人们已经明确地说明了你的问题有很多不同的答案,所有答案都是基于类似的前提。使用带有负数的DATEADD()返回一个月。或者比较月份和年份,看看它们是否相同。前者在1个月前到今天,后者在上个月。

到目前为止,所有答案都是@DasBlinkenLight和@TimBiegeleisen,未能考虑列的TIME组件和GETDATE()函数(如果有的话)。如果您的专栏为DATETIME,则需要将其考虑在内。以上SELECT查询将为您提供一些方法,以便我可以根据您的需要访问不同的日期。

至于使用BETWEEN日期时要小心!因为您输入的值是包容性的,所以如果您将GETDATE()放在Between语句的右侧,您也可以得到今天的结果,但您可能真的想要UP TO到今天,在这种情况下您应该更改你的右派论点。我也不确定Oracle,mysql等,但Micrsofot SQL-Server的精确到.003毫秒。所以,如果你真的想看一个约会的午夜,你应该看看23:59:59.997,因为.998和.999会一直到第二天。

另外为了进一步简化您是否需要时间组件,您还可以将列投放到DATE,这实际上会缩短时间和BETWEEN,因为它会更清晰,例如CAST(n.JOIN_DATE AS DATE)

关于stackoverflow的这个主题肯定还有其他问题我鼓励你去研究。

答案 5 :(得分:-1)

我知道这很简单,我错过了一些东西。根据我收到的许多回复,我的代码是错误的,我将苹果与橙子进行比较,而不是将苹果与苹果进行比较。我在Month()函数周围添加dateadd后,就可以了。

答案 6 :(得分:-2)

对此答案的回复是正确的。但是根据最佳实践,以这种方式编写查询将使其不那么SARGABLE,因此如果你有索引,它会忽略索引。把它写成

可能更好
WHERE n.JOIN_DATE between DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE())-1, 0)  AND DATEADD(MONTH, DATEDIFF(MONTH, -1, GETDATE())-1, -1) 

根据下面的评论,我修改了查询。我想我没有深入阅读这个问题。