SQL 使用两个提前 16 个月的日期字段返回记录

Posted

技术标签:

【中文标题】SQL 使用两个提前 16 个月的日期字段返回记录【英文标题】:SQL to return records using two date fields that fall 16 months ahead of each other 【发布时间】:2017-11-28 02:46:20 【问题描述】:

我有一个包含两个 DATETIME 字段的表,OpeningDate 和 FinishingDate。

我正在尝试编写一个查询,该查询返回 FinishingDate 正好比 OpeningDate 早 16 个月的所有记录。

我知道如何编写查询来检查两个日期之间(使用 SQL BETWEEN 和 DATEADD),但我不确定如何执行此查询。

我试过了:

SELECT * FROM Sales
WHERE FinishingDate between OpeningDate AND DATEADD(MONTH, 16, OpeningDate)

但它似乎给了我所有这些日期之间的记录,而不仅仅是那些正好提前 16 个月的记录。

任何帮助都会很棒。

谢谢!

【问题讨论】:

WHERE FinishingDate = DATEADD(MONTH, 16, OpeningDate) 是否包括第 16 个月内的所有天数?让我们考虑一下 2015 年 10 月 31 日。未来 16 个月不是 2017 年 2 月 31 日,因为 2 月只有 28 天。 【参考方案1】:

除非我遗漏了什么,否则FinishingDate 正好比OpeningDate 提前 16 个月:

SELECT * FROM Sales
WHERE FinishingDate = DATEADD(MONTH, 16, OpeningDate)

【讨论】:

是的,这就是我所追求的。非常感谢!【参考方案2】:

我的做法是:

SELECT FinishingDate,OpeningDate FROM Sales
group by FinishingDate,OpeningDate
having DATEDIFF(m,OpeningDate,FinishingDate) >= 16

【讨论】:

【参考方案3】:

FinishingDate 正好提前 16 个月的所有记录 开幕日期。

我不能完全确定,但这可能不一定是确切的日期。如果是这种情况,则日期范围将大于或等于第 16 个月的第一天且小于第 17 个月的第一天。

SELECT * 
  FROM Sales
 WHERE FinishingDate >= --greater than or equal to start of 16th month
                        DATEADD(month, DATEDIFF(month, 0, DATEADD(MONTH, 16, OpeningDate)), 0)  
   AND FinishingDate < --less than the start of the 17th month
                        DATEADD(month, DATEDIFF(month, 0, DATEADD(MONTH, 16, OpeningDate)) + 1, 0)

【讨论】:

以上是关于SQL 使用两个提前 16 个月的日期字段返回记录的主要内容,如果未能解决你的问题,请参考以下文章

带有日期循环的 SQL [关闭]

前几个月的 SQL 固定日期

Tsql -> 从今天开始过滤 6 个月的数据,表中的日期字段为 YYYYMM

获取几个月的最新记录并使用 Oracle PL-SQL 为每个 ID 汇总其值

sql 查询中 有12个月表 写一个查询从中提取所有日期

sql怎样列出一个月的全部日期