【问题标题】:How to Target Last Month in SQL Query如何在 SQL 查询中定位上个月
【发布时间】:2019-10-29 18:35:24
【问题描述】:

我在 SQL 查询中使用此代码

WHERE [Date] >= DATEFROMPARTS(DATEPART(year,GETDATE()),DATEPART(month,GETDATE())-1,DATEPART(day,GETDATE()))
  AND [Date] <= EOMONTH(DATEFROMPARTS(DATEPART(year,GETDATE()),DATEPART(month,GETDATE())-1,DATEPART(day,GETDATE())));

问题来了 2020 年 12 月的查询会报错

我发布的代码管理返回数据的日期。它查看代码运行的日期并选择从上个月到上个月末的那一天。我需要的是从调用此代码之前一个月的第一天到最后一天的日期。

我明天将研究这个问题,看看其他人能想出什么解决方案会很有趣。

【问题讨论】:

  • “问题是 2020 年 12 月查询将通过错误”。我没有看到任何错误。 db<>fiddle
  • 你要使用'2020-12-31'吗?
  • 如果您无法在文本中定义您想要完成的任务,您将难以编写适当的代码。而且您可能并不真正了解您的目标。如果今天是 2019 年 3 月 30 日,您打算在查询中使用哪些日期作为边界?如果您的目标是使用上个月的同一天,则需要明确定义如何处理这些月末问题。
  • 不一定正确 SMor,有阅读障碍 我发现用英语而不是代码来定义我的编码问题要困难得多。下面的人向我指出 DATEADD 是我执行此操作所需要的。它可以让我从一月减去一个月,希望得到十二月。

标签: sql sql-server sql-server-2012 sql-server-2012-express


【解决方案1】:

试试这个

SELECT DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) - 1, 0),
    DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0) - 1 

它会告诉你上个月的开始和结束日期

【讨论】:

  • 比我的版本短...使用 0 作为开始日期基础而不是实际日期的有趣技术。否则基于预期的类型参数不明显......喜欢它......
【解决方案2】:

如果你想要上个月:

where date >= dateadd(month, -1, datefromparts(year(getdate(), month(getdate(), 1))) and
      date < datefromparts(year(getdate(), month(getdate(), 1))

这只是检查它是否在本月的第一天之前,然后从中减去一个月。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-10
  • 2019-12-18
  • 1970-01-01
  • 2017-03-30
  • 2021-01-26
  • 1970-01-01
  • 2018-08-21
相关资源
最近更新 更多