【问题标题】:Finding a gap in dates寻找日期的差距
【发布时间】:2015-06-11 08:09:42
【问题描述】:

我有一个包含 3 列的表格:

Date smalldatetime not null
Val1 decimal not null
Val2 decimal not null

而且这张表中有很多数据。表中并未显示所有日历日期。如何找到日期间隔大于xdays 的所有地方?

【问题讨论】:

  • 如果您指定要查找的内容与要查找的内容之间的差距,您可能会得到更好的答案。一些数据示例和说明它们如何证明差距也会有所帮助。
  • SQL gaps in dates的可能重复

标签: sql sql-server sql-server-2008 tsql stored-procedures


【解决方案1】:

您可以这样做:

DECLARE @t TABLE
    (
      Date SMALLDATETIME NOT NULL ,
      Val1 DECIMAL NOT NULL ,
      Val2 DECIMAL NOT NULL
    )

INSERT INTO @t VALUES
('20150101', 1, 1),
('20150104', 1, 1),
('20150109', 1, 1),
('20150201', 1, 1),
('20150305', 1, 1),
('20150506', 1, 1)


;WITH cte AS(SELECT *, ROW_NUMBER() OVER(ORDER BY Date) AS Rn FROM @t)
SELECT c2.*, c1.Date AS PrevDate FROM cte c1
JOIN cte c2 ON c1.Rn = c2.Rn - 1
WHERE DATEDIFF(d, c1.Date, c2.Date) > 30 --this is your X

输出:

Date                Val1    Val2    Rn  PrevDate
2015-03-05 00:00:00 1       1       5   2015-02-01 00:00:00
2015-05-06 00:00:00 1       1       6   2015-03-05 00:00:00

【讨论】:

  • @Ilan - 可惜你不在 2012/2014 年 - LAG/LEAD 会表现更好(不需要自我加入)
【解决方案2】:

您可以在 SQL Server 数据库中创建日期表并使用SQL date table to find gaps in date

日期表是包含所有可能日期的参考表。您将比较目标表与日期表加入日期列并列出缺失的列

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多