【问题标题】:How to get all days in a date range even if no data exists also in SQL Server?即使 SQL Server 中也不存在数据,如何获取日期范围内的所有日期?
【发布时间】:2016-06-26 14:20:00
【问题描述】:

我有一个名为 Employee 的表名。即使缺少任何一天,我也想获得所有日期。

表:

create table Employee(id int, dateCheck datetime)
insert into Employee values(1, '2016/01/01')
insert into Employee values(2, '2016/01/02')
insert into Employee values(3, '2016/01/05')
insert into Employee values(4, '2016/01/07')

例如:

+-------------------+--------------------------+
|Name               | dateCheck                |
+-------------------+--------------------------+
| 1                 | 2016-01-01 00:00:00.000  |
| 2                 | 2016-01-02 00:00:00.000  |
| 3                 | 2016-01-05 00:00:00.000  |
| 4                 | 2016-01-07 00:00:00.000  |
+-------------------+--------------------------+

我需要如下输出:

+-------------------+--------------------------+
|Name               | dateCheck                |
+-------------------+--------------------------+
| 1                 | 2016-01-01 00:00:00.000  |
| 2                 | 2016-01-02 00:00:00.000  |
| 0                 | 2016-01-03 00:00:00.000  |
| 0                 | 2016-01-04 00:00:00.000  |
| 3                 | 2016-01-05 00:00:00.000  |
| 0                 | 2016-01-06 00:00:00.000  |
| 4                 | 2016-01-07 00:00:00.000  |
+-------------------+--------------------------+

请帮我解决这个问题。

【问题讨论】:

  • 最好创建一个日历表并将其与您的表交叉连接。

标签: sql-server


【解决方案1】:

试试

;WITH dt (mindt, mxdt) 
     AS (SELECT Min(dateCheck), 
                Max(dateCheck) 
         FROM   Employee 
         UNION ALL 
         SELECT Dateadd(day, 1, mindt), 
                mxdt 
         FROM   dt 
         WHERE  Dateadd(day, 1, mindt) <= mxdt) 
SELECT isnull(em.id,0) as id, 
       dt.mindt 
FROM   dt 
       LEFT JOIN employees em 
              ON mindt = em.dateCheck 

【讨论】:

  • 赞成,但肯定有更好的方法来生成日期,如 Tally 表
  • 我认为必须有FULL OUTER JOIN 而不是LEFT JOIN
  • 你可以简单地检查结果,左连接很好,因为 dt 包含所有数据,谢谢
【解决方案2】:

单击here 获取建议的方法。 Tally 表很棒,但是,一些实现并不高效。有一个物理日期表有时会很有帮助。

【讨论】:

    猜你喜欢
    • 2012-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多