【发布时间】:2015-10-27 19:19:22
【问题描述】:
我有一个名为 periodDefinition 的表,其中包含 rowNum、periodSeq、startDate、endDate 列。我正在尝试编写一个 SQL 查询来查找一行的 endDate 和下一行的 startDate 之间的差距。现在,如果下一行的 startDate 与上一行的 endDate 的日期不完全相同,它就会看到一个“差距”。
大多数建议似乎是创建一个日历临时表并仔细检查,但由于工作限制政策,我不能这样做。感谢您提供的任何建议。
样本数据:
rowNum: 1, periodSeq: 1, startDate: 09/01/2014, endDate: 09/30/2014
rowNum: 2, periodSeq: 2, startDate: 10/01/2014, endDate: 10/30/2014
rowNum: 3, periodSeq: 4, startDate: 11/01/2014, endDate: 11/30/2014
测试查询:
SELECT endDate, startDate
FROM
(
SELECT DISTINCT startDate, ROW_NUMBER() OVER (ORDER BY startDate) RN
FROM dbo.PeriodDefinition T1
WHERE
NOT EXISTS (
SELECT *
FROM dbo.PeriodDefinition T2
WHERE T1.startDate > T2.startDate AND T1.startDate < T2.endDate
)
) T1
JOIN (
SELECT DISTINCT endDate, ROW_NUMBER() OVER (ORDER BY endDate) RN
FROM dbo.PeriodDefinition T1
WHERE
NOT EXISTS (
SELECT *
FROM dbo.PeriodDefinition T2
WHERE T1.endDate > T2.startDate AND T1.endDate < T2.endDate
)
) T2
ON T1.RN - 1 = T2.RN
WHERE
endDate < startDate
结果:
结束日期:2014 年 9 月 30 日,开始日期,2014 年 1 月 1 日
结束日期:2014-09-30,开始日期:2014-11-01
结束日期:2014-10-30,开始日期:2014-12-01
期望的结果:
结束日期:2014-10-30,开始日期:2014-11-01
【问题讨论】:
-
这是一篇非常深入的文章,涵盖了这个主题。 sqlservercentral.com/articles/T-SQL/123609
-
太糟糕了,贵公司对创建一些实用程序表以使事情变得更容易和更快有如此奇怪的限制。 >.
-
@SeanLange 长话短说,这是因为需要有一个临时表,其中包含可能追溯到几十年前的历史日期。
-
但是日历表不应该是临时表。它应该是一张永久的桌子。不允许日历表就像不允许计数表一样。当然我仍然可以获取数据,但是如果没有,一些查询会慢很多。
-
我不了解您的示例数据。你从哪里拉
2014-01-01和2014-12-01?您是否只希望获得所需结果中的那一行?
标签: sql-server date