【问题标题】:Get data from last month in SQL Server在 SQL Server 中获取上个月的数据
【发布时间】:2018-04-27 13:55:09
【问题描述】:

我检查了Get the records of last month in SQL server,但没有成功!

我尝试根据我的数据库表和列issue_date获取上个月的记录。

执行此操作的 SQL 查询是什么?

为了澄清,今天(2018 年 4 月 27 日)我想获取 3 月 18 日的所有记录。

我有转换为日期格式的 issue_date,但下面的代码为我提供了从 2018 年 3 月 1 日到今天(包括今天)的所有记录。

DATEPART(month, CONVERT (VARCHAR(11),DATEADD(day,wo_header.issue_date,`1971/12/31`),106)) = DATEPART(month, DATEADD(month, -1, getdate()))

【问题讨论】:

  • 你不能像下面这样在一个月前得到它吗? WHERE issue_date >= GETDATE()-30
  • -30 代表天数。我想要实现的是有一个代码,可以在 4 月运行时给我 3 月的数据(每天 - 所以它不能在几天内中继)
  • 所以您想要从 3 月 1 日到 3 月 31 日的数据?
  • 在这种情况下是的。但在 5 月,它会移至 4 月 1 日至 4 月 30 日等……根据我的问题,总是在上个月。
  • 我认为这篇文章会给你一个想法。 stackoverflow.com/a/8458350/7100903

标签: sql sql-server tsql


【解决方案1】:

获取上个月的 firstDay 和 lastDay

DECLARE @FirstDayOfLastMonth     DATETIME = CONVERT(DATE, DATEADD(d, -(DAY(DATEADD(m, -1, GETDATE() - 2))), DATEADD(m, -1, GETDATE() - 1))),
        @LastDayOfLastMonth      DATETIME = CONVERT(DATE, DATEADD(d, -(DAY(GETDATE())), GETDATE()))

        SELECT @FirstDayOfLastMonth, @LastDayOfLastMonth

您需要的查询

 SELECT *
       FROM   TABLE
       WHERE  CAST(issue_date AS DATE) BETWEEN CONVERT(DATE, DATEADD(d, -(DAY(DATEADD(m, -1, GETDATE() - 2))), DATEADD(m, -1, GETDATE() - 1))) AND CONVERT(DATE, DATEADD(d, -(DAY(GETDATE())), GETDATE()))

【讨论】:

  • 感谢加扎尼。恐怕我无法声明任何变量。是某种报表设计器环境,需要以select语句开头。
  • 在第二个查询中,我没有使用任何变量。
【解决方案2】:

也许最简单的方法是eomonth()。如果issuedate上没有时间组件:

where issuedate > eomonth(getdate(), -2) and
      issuedate <= eomonth(getdate(), -1)

如果有时间分量:

where issuedate >= dateadd(day, 1, cast(eomonth(getdate(), -2) as date)) and
      issuedate < dateadd(day, 1, cast(eomonth(getdate(), -1) as date))

没有 eomonth,我会这样做:

where issueate = dateadd(month, -1, cast(dateadd(day, 1 - day(getdate()), getdate()) as date))

【讨论】:

  • 还是没有运气。我使用的 SQL 混合非常受限,并且 eomonth 不可用。我现在尝试做的是从日期(Month(CONVERT (VARCHAR(11),DATEADD(day,wo_header.closing_date,1971/12/31),106))) 开始计算月份并添加 WHERE 条件(Month(CONVERT (VARCHAR(11),DATEADD(day,wo_header.closing_date,1971/12/31),106)))' = '(Month(CONVERT (VARCHAR(11),DATEADD(day,wo_header.closing_date,1971/12/31),106)))' - 1。它还没有工作。
【解决方案3】:

我发现的代码并不漂亮,但它可以工作。它首先在我的代码的 SELECT 部分添加带有月份编号的额外列:

Month(CONVERT (VARCHAR(11),DATEADD(day,wo_header.closing_date,'1971/12/31'),106))  As Month

And than 用于 WHERE 语句:

Month(CONVERT (VARCHAR(11),DATEADD(day,wo_header.closing_date,'1971/12/31'),106)) = month(getdate())-1

所以对于像我这样在 SQL 报告类环境中工作的人来说,它应该可以工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-02
    • 2019-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多