【问题标题】:Retrieve the data for all previous months of the same year except today's date检索除今天日期之外的同一年所有前几个月的数据
【发布时间】:2017-07-20 19:34:09
【问题描述】:

在编写查询以获取同一年之前所有月份的数据时需要帮助。

如果今天的日期是 2017 年 7 月 20 日,我需要检索除今天(2017 年 7 月 20 日)之外的同一年之前所有月份的数据。

如果日期是 2017 年 7 月 20 日,则数据应包括 2017 年 1 月 17 日至 2017 年 7 月 19 日等。

如果日期是 2017 年 7 月 21 日,则数据应包括 2017 年 1 月 17 日至 2017 年 7 月 20 日

谢谢

【问题讨论】:

  • 我们很乐意提供帮助,但首先您需要向我们展示您已经尝试过的内容。 SO 不是代码编写服务。
  • 这个我试过了
  • 要获取当天的 00:00:00 小时,您只需转换为 DATE 数据类型(删除时间)并在必要时转换回 DATETIME CAST(CAST(GETDATE() AS DATE) AS DATETIME)。除此之外,您需要提供minimal reproducible example 以便我们为您提供帮助。
  • select DATEPART(m, DATEADD(m, 0, getdate())), DATEPART(yyyy, DATEADD(m, -1, getdate())) .. 但是这个检索数据只有当前月份,也不排除当前日期

标签: sql sql-server


【解决方案1】:

没有看到代码很困难,但是在 where 子句中是这样的......

WITH DATES AS (
SELECT GETDATE() AS MYDATE
UNION
SELECT CONVERT(DATETIME,'01/01/1999 12:00:00.000')
UNION
SELECT CONVERT(DATETIME,'01/02/2016 12:00:00.000')
UNION
SELECT CONVERT(DATETIME,'01/04/2007 12:00:00.000')
UNION
SELECT CONVERT(DATETIME,'01/05/2005 12:00:00.000')
UNION
SELECT CONVERT(DATETIME,'01/05/2017 12:00:00.000')
UNION
SELECT CONVERT(DATETIME,'01/01/2017 14:00:00.000')
)
SELECT * FROM DATES
WHERE 
CONVERT(DATE,DATES.MYDATE) < CONVERT(DATE,GETDATE())
AND 
DATEPART(YEAR,DATES.MYDATE) = DATEPART(YEAR,GETDATE())

【讨论】:

    【解决方案2】:
    SELECT *
    FROM yourTable
    WHERE
        dateCol >= DATEADD(yy,  DATEDIFF(yy,  0, GETDATE()), 0) AND
        dateCol < CAST(GETDATE() AS DATE)
    

    Demo

    【讨论】:

    • 它不检索 2017 年 7 月 19 日的数据。它提供的数据直到 2017 年 7 月 18 日
    • @SwatiJain 检查演示,我的查询应该适合你。
    • @TimBiegeleisen OP 的专栏可能是日期时间,并且有您的查询将在最后一天消除的时间部分。您可以在右侧再添加一天并用 >= 和 替换
    • @NenadZivkovic 我想我明白了...感谢您的编辑。
    【解决方案3】:

    这只是一个问题,如何获得当年的 1 月 1 日,以及如何获得昨天。有多种方法可以做到这一点。以下是其中一种方法,其他想法不同的答案也可以。

    SELECT * FROM YourTable
    WHERE YourDateCol >= DATEFROMPARTS(YEAR(GETDATE()),1,1)
    AND YourDateCol < CAST(GETDATE() AS DATE) 
    

    对于昨天,您实际上是在 0:00 获取今天并获取在那之前的所有内容。

    【讨论】:

      【解决方案4】:

      要以有效的方式执行此操作,请放置两个变量,它们将包含一年中的第一天和今天的日期。

      DECLARE @firstDayOfYear as DateTime;
      DECLARE @today as DateTime;
      
      SET @firstDayOfYear = DATEFROMPARTS(YEAR(GETDATE()),1,1);
      SET @today = CAST(GETDATE() AS DATE);
      
      SELECT * FROM [table]
      WHERE [dateColumnToCompare] >= @firstDayOfYear
      AND [dateColumnToCompare] < @today;
      

      【讨论】:

        猜你喜欢
        • 2020-09-28
        • 2019-04-10
        • 1970-01-01
        • 2021-06-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多