【问题标题】:SQL how to get information from The Start of some # of years agoSQL如何从几年前的开始获取信息
【发布时间】:2021-01-13 13:05:36
【问题描述】:

我浏览了一些帖子,但要么信息太多,要么我不太明白我在寻找什么。 例如:How to get the first and last date of the current year?

在一张表中,我有过去 20 年的销售订单,我只想显示从三年前的 1 月 1 日到当前日期的订单。

   AND ShipDate >= (YEAR(ShipDate)-3)

这不起作用。

AND ShipDate >= DATEADD(YEAR,-2,GETDATE())

从今天开始,正好显示 2 年前。

我希望最终能够创建能够单独显示每年最后三年的报告,但这是第一步,到目前为止我做得并不好!

【问题讨论】:

  • 您使用的是哪种 DBMS 产品? “SQL”只是所有关系数据库使用的一种查询语言,而不是特定数据库产品的名称(并且您的查询使用了非标准语法)。请为您正在使用的数据库产品添加tagWhy should I tag my DBMS
  • 一些示例可以清楚地说明“三年前”的含义。我还根据问题中的代码添加了 SQL Server 标记。
  • WHERE ShipDate BETWEEN DATETIMEFROMPARTS(YEAR(CURRENT_TIMESTAMP)-3, 1, 1, 0, 0, 0, 0) AND CURRENT_TIMESTAMP 工作吗?

标签: sql sql-server datetime


【解决方案1】:

我想要显示从三年前的 1 月 1 日到当前日期的订单。

SQL Server 中最好的方法是:

where shipdate >= datefromparts(year(getdate()) - 3, 1, 1)

对于 2021 年的任何日期,这将返回 2021、2020、2019 和 2018 年的所有行。如果您不想要 2018,请使用 - 2 而不是 - 3

此公式具有优化器友好的选项(例如,允许使用索引和分区)。另外两个常见的说法是这样写对优化器不友好:

where datediff(year, shipdate, getdate()) <= 3
where year(shipdate) >= year(getdate()) - 3

(再一次,“3”可能是“2”,这取决于您的真正意图。)

【讨论】:

    【解决方案2】:

    你很亲密:

    AND YEAR(ShipDate) >= (YEAR(ShipDate)-3)
    

    您将年份与日期进行比较

    【讨论】:

      猜你喜欢
      • 2011-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-24
      • 1970-01-01
      相关资源
      最近更新 更多