SQL Server:在查询中插入空行

时间:2014-10-22 03:13:40

标签: sql sql-server

这可能是去年,但我使用的是SQL Server 2005

stmpdate      intime
----------------------
2014-10-08   08:04:43
2014-10-09   07:57:13
2014-10-10   07:57:14
2014-10-16   07:79:56
2014-10-17   07:45:56

我有这张桌子。它保留了员工的入住时间,但该员工每月都没有办理登机手续。所以我希望它是这样的

    stmpdate    intime
1   2014-10-01  
2   2014-10-02  
3   2014-10-03  
4   2014-10-04  
5   2014-10-05  
6   2014-10-06  
7   2014-10-07  
8   2014-10-08  08:04:43
9   2014-10-09  07:57:13
10  2014-10-10  07:57:14
11  2014-10-11  
12  2014-10-12  
13  2014-10-13  
14  2014-10-14  
15  2014-10-15  
16  2014-10-16  07:59:56
17  2014-10-17  07:45:56
18  2014-10-18  
19  2014-10-19  
20  2014-10-20  
21  2014-10-21  
22  2014-10-22  
23  2014-10-23  
24  2014-10-24  
25  2014-10-25  
26  2014-10-26  
27  2014-10-27  
28  2014-10-28  
29  2014-10-29  
30  2014-10-30  
31  2014-10-31  

我试图创建一个包含该月份中每个日期的临时表,然后将其与我提到的第一个表连接起来,但它似乎不起作用。

declare @datetemp table (
stmpdate varchar(10)
);
insert into @datetemp 
SELECT '2014-10-01'
UNION ALL
SELECT '2014-10-02'
UNION ALL
SELECT '2014-10-03'
....

SELECT dtt.stmpdate, intime
FROM @datetemp dtt left join v_dayTimesheet
on dtt.stmpdate=v_dayTimesheet.stmpdate
WHERE (emp_no = '001234567')

这是上面查询的结果

stmpdate    intime
2014-10-08  08:04:43
2014-10-09  07:57:13
2014-10-10  07:57:14
2014-10-16  07:59:56
2014-10-17  07:45:56

这是select * from @datetemp

的结果
2014-10-01
2014-10-02
2014-10-03
2014-10-04
2014-10-05
2014-10-06
2014-10-07
2014-10-08
2014-10-09
2014-10-10
2014-10-11
2014-10-12
2014-10-13
2014-10-14
2014-10-15
2014-10-16
2014-10-17
2014-10-18
2014-10-19
2014-10-20
2014-10-21
2014-10-22
2014-10-23
2014-10-24
2014-10-25
2014-10-26
2014-10-27
2014-10-28
2014-10-29
2014-10-30
2014-10-31

3 个答案:

答案 0 :(得分:1)

您仅在emp_no具有值的位置进行过滤。如果他们没有办理登机手续,由于您只有日期信息而没有员工编号,因此不会在该行上返回。所以你必须允许等于或为空。

SELECT  dtt.stmpdate, intime

FROM    @datetemp dtt 

        left outer join v_dayTimesheet
           on dtt.stmpdate=v_dayTimesheet.stmpdate

WHERE   emp_no = '001234567' or emp_no is null

另外,对于您的日期...请查看:http://www.sqlservercurry.com/2010/03/generate-start-and-end-date-range-using.html

DECLARE
@StartDate datetime = '2010-01-01',
@EndDate   datetime = '2010-03-01'

;WITH datetemp as
(
       SELECT @StartDate as stmpdate
       UNION ALL
       SELECT DATEADD(day, 1, stmpdate)
       FROM   datetemp 
       WHERE  DATEADD(day, 1, stmpdate) <= @EndDate    
)

SELECT stmpdate   
FROM   datetemp; 

然后,您将从datetemp中选择一个普通表格。但要注意,公共表表达式只能在with语句之后立即使用一次。


请相信我这个...运行此查询,看看你的空白行是如何出现的:

SELECT  dtt.stmpdate, intime, emp_no 

FROM    @datetemp dtt 

        left outer join v_dayTimesheet
           on dtt.stmpdate=v_dayTimesheet.stmpdate

WHERE   emp_no = '001234567' or emp_no is null

所有这些行都将返回emp_no = 001234567

stmpdate    intime
2014-10-08  08:04:43
2014-10-09  07:57:13
2014-10-10  07:57:14
2014-10-16  07:59:56
2014-10-17  07:45:56

并且所有空白行的空值为emp_no。

答案 1 :(得分:0)

我得到了答案!!

SELECT dtt.stmpdate, intime
FROM @datetemp dtt left join 
(
    SELECT stmpdate, intime
    FROM v_dayTimesheet 
    WHERE (emp_no = '001234567') 
) as vdayTimesheet
 on sparedate.stmpdate=vdayTimesheet.stampdate
ORDER BY stmpdate

这就是我想要的,谢谢大家

答案 2 :(得分:0)

SQL查询: 的 SQLFIDDLEExample

SELECT t2.dt,
       isnull(t1.intime, '') intime
FROM 
(
    SELECT DATEADD(day,number,'2014-10-01') dt
    FROM master..spt_values 
    WHERE Type = 'P' 
    AND DATEADD(day,number,'2014-10-01') >= '2014-10-01'
    AND DATEADD(day,number,'2014-10-01') < '2014-11-01'
 ) t2
LEFT JOIN Table1 t1
ON t1.stmpdate = t2.dt

结果:

|                             DT |   INTIME |
|--------------------------------|----------|
| October, 01 2014 00:00:00+0000 |          |
| October, 02 2014 00:00:00+0000 |          |
| October, 03 2014 00:00:00+0000 |          |
| October, 04 2014 00:00:00+0000 |          |
| October, 05 2014 00:00:00+0000 |          |
| October, 06 2014 00:00:00+0000 |          |
| October, 07 2014 00:00:00+0000 |          |
| October, 08 2014 00:00:00+0000 | 08:04:43 |
| October, 09 2014 00:00:00+0000 | 07:57:13 |
| October, 10 2014 00:00:00+0000 | 07:57:14 |
| October, 11 2014 00:00:00+0000 |          |
| October, 12 2014 00:00:00+0000 |          |
| October, 13 2014 00:00:00+0000 |          |
| October, 14 2014 00:00:00+0000 |          |
| October, 15 2014 00:00:00+0000 |          |
| October, 16 2014 00:00:00+0000 | 07:79:56 |
| October, 17 2014 00:00:00+0000 | 07:45:56 |
| October, 18 2014 00:00:00+0000 |          |
| October, 19 2014 00:00:00+0000 |          |
| October, 20 2014 00:00:00+0000 |          |
| October, 21 2014 00:00:00+0000 |          |
| October, 22 2014 00:00:00+0000 |          |
| October, 23 2014 00:00:00+0000 |          |
| October, 24 2014 00:00:00+0000 |          |
| October, 25 2014 00:00:00+0000 |          |
| October, 26 2014 00:00:00+0000 |          |
| October, 27 2014 00:00:00+0000 |          |
| October, 28 2014 00:00:00+0000 |          |
| October, 29 2014 00:00:00+0000 |          |
| October, 30 2014 00:00:00+0000 |          |
| October, 31 2014 00:00:00+0000 |          |