2013-03-11 48 views
2
select 
    e.E_ID as Employee_ID, 
    e.E_NAME as Employee_Name, 
    convert(varchar(10),a.Date,103) as Date , 
    convert(varchar(8),a.Timein,108) as Time_In, 
    convert(varchar(8),a.Timeout,108) as Time_Out 
from Employee e 
LEFT JOIN Attendance a 
    ON a.E_ID = e.E_ID 
    AND (convert(varchar(10),a.Date,103) between '01/02/2013' And '28/02/2013') 

以上是我的查询,我从两个表中获取数据,但它打印1月份的值以及不在查询中的数据。来自sql server 2005的出界限答案

我一直在调试一个小时,请任何人帮忙。

+0

编辑快速@Raph :) – Pyromancer 2013-03-11 08:38:16

+1

@AlfredSanz甚至不愤怒) – 2013-03-11 08:38:40

回答

2

BETWEENdd/mm/yyyy格式化的字符串不会工作!

要带回排在二月使用

LEFT JOIN Attendance a 
    ON a.E_ID = e.E_ID AND a.Date BETWEEN '20130201' AND '20130228' 

,或者如果a.Date值可能有一个时间成分以外00:00:00

LEFT JOIN Attendance a 
    ON a.E_ID = e.E_ID AND a.Date >= '20130201' AND a.Date < '20130301' 

铸造列varchar是unsargable和手段的索引寻找不能使用,

+0

char数据类型的转化为smalldatetime数据类型导致了外的范围SMALLDATETIME值。 (这是我得到的,如果我不强调它) – 2013-03-11 08:50:00

+0

@WajahatKareem - 这不是来自我的答案中的代码。所有的值转换为'smalldatetime'很好。 'SELECT CAST( '20130201' AS SMALLDATETIME),CAST( '20130228' AS SMALLDATETIME),CAST( '20130201' AS SMALLDATETIME),CAST( '20130301' AS SMALLDATETIME)' – 2013-03-11 08:52:47

+0

THANX THANX THANX THANX感谢名单...... .......... Wooo,解决了我的问题 – 2013-03-11 08:57:01

1
Try below and see if it helps 

select 
    e.E_ID as Employee_ID, 
    e.E_NAME as Employee_Name, 
    convert(varchar(10),a.Date,103) as Date , 
    convert(varchar(8),a.Timein,108) as Time_In, 
    convert(varchar(8),a.Timeout,108) as Time_Out 
    from Employee e 
    LEFT JOIN Attendance a 
    ON a.E_ID = e.E_ID 
    Where (convert(varchar(10),a.Date,103) between '01/02/2013' And '28/02/2013') 
+0

这将左连接转换回内连接。 – 2013-03-11 08:41:58

+0

这是完美的silution – 2013-03-11 08:43:02

+0

与我的查询有什么不同? – 2013-03-11 08:44:35