【问题标题】:Calculating orders placed on the end of the month计算月底下的订单
【发布时间】:2016-10-27 23:34:07
【问题描述】:

我目前正在使用本书 Ben-Gan, Itzik 学习 SQL Server。 T-SQL 基础。下面是一个查询,用于选择月底下的订单。 (我知道函数EOMONTH()也可以用)

SELECT orderid, orderdate, custid, empid 
FROM Sales.Orders  
WHERE orderdate = DATEADD( month, DATEDIFF( month, '18991231', orderdate), '18991231');

作者的解释是:

这个表达式首先计算整体的差异 某个月的最后一天(1899 年 12 月 31 日,在 本例)和指定的日期。将此差异称为差异。经过 将差异月份添加到锚定日期,您将获得最后一天 目标月份。

但是,我仍然对它的实际工作方式有些困惑。有人会解释一下吗?

【问题讨论】:

  • 当您深入了解数据库的报告方面时,您会发现数据仓库。然后你会发现这个叫做日历表的东西,它是解决这个问题的另一种方法:创建一个表,列出每天的所有有用属性以及该日期的每个有用属性,包括该月的最后一天是什么。由于您正在学习 SQL Server,因此看到解决同一问题的两种完全不同(但都是完全有效)的方法对您很有启发。

标签: sql sql-server tsql


【解决方案1】:

这似乎是一种相当神秘的方法。代码所做的是计算自某个月的最后一天以来的月数。然后,它将这个月数添加到该日期。由于dateadd() 的规则,月份仍然是最后一个日期。

不过,我更喜欢更简单的方法:

where day(dateadd(day, 1, orderdate)) = 1

我觉得这更清楚了。

【讨论】:

  • @GordenLinoff,谢谢回答,这似乎更容易理解:)
【解决方案2】:
select DATEDIFF(MONTH, '20160131', '20160201')

给我们 1 个月的时间

SELECT DATEADD(month, 1, '20160131')

给我们 2016-02-29 00:00:00.000

没关系

【讨论】:

    【解决方案3】:

    我自己尝试了这个查询,似乎已经掌握了窍门。这是我写的以防万一其他人感兴趣

    SELECT DATEADD(month, DATEDIFF(MONTH, '20160131', '20160201'), '20160131');
    

    结果:

    2016-02-29 00:00:00.000
    

    所以我的解释是,将一个或多个“月份”添加到该月的最后一天为 31 的特定日期将始终返回一个日期,其中该日期是该月的最后一天。如果这句话有任何意义...

    【讨论】:

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