Reputation: 181
I have one table name called Employee. I would like to get all date even if any one of the days is missing also.
Table :
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')
E.g:
+-------------------+--------------------------+
|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 |
+-------------------+--------------------------+
I need output like below :
+-------------------+--------------------------+
|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 |
+-------------------+--------------------------+
Please help me to solve this task.
Upvotes: 1
Views: 685
Reputation: 524
Click here for a suggested approach. Tally tables are great, however, some of the implementations are not performant. Having a physical date table can sometime help tremendously.
Upvotes: 0
Reputation: 1240
try
;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
Upvotes: 2