2012-02-20 68 views
1

我有2代表的结构与DATEDIFF日期格式

Emp Table 

id name 

001 Smith 
002 Jerry 


Leave 
sr.no reason  from_date  to_date  request_by status 
1  PL   2011-12-11  2011-12-15  001  Declined 

2  PL   2011-11-13  2011-11-13  001  Approved 

3  PL   2011-10-02  2011-10-05  002  Declined 

现在我已经写了这个查询

select DATEDIFF(Leave.from_date,Leave.to_date)as cdate, 
Emp.id as emp 
from Leave left join Emp 
on Leave.request_by=Emp.id 

给我差这两个日期之间等...

cdate emp 
-4  001 
    0  001 
-3  002 

“2011-12-11 & 2011-12-15”之间的输出差异的第一件事情需要是5连续几天员工缺席。我们实现了它。

但我需要日期格式如('%Y%m%d')和+如果日期差异是说-4,那么应该显示4条记录。 所以我想编写一个查询这给像这样的输出......

cdate   emp 
2011-12-11  001 
2011-12-12  001 
2011-12-13  001 
2011-12-14  001 
2011-12-15  001 
2011-11-13  001 
2011-10-02  002 
2011-10-03  002 
2011-10-04  002 
2011-10-05  002 

所以任何人可以告诉我,我应该怎么需要写我的查询来获取这个输出?

回答

2

尝试此查询 -

CREATE TABLE temp_days(d INT(11)); 
INSERT INTO temp_days VALUES 
    (0),(1),(2),(3),(4),(5), 
    (6),(7),(8),(9),(10), 
    (11),(12),(13),(14),(15); -- maximum day difference, add more days here 

SELECT l.from_date + INTERVAL td.d DAY cdate, e.id emp 
FROM 
    `leave` l 
LEFT JOIN Emp e 
    ON l.request_by = e.id 
JOIN temp_days td 
    ON DATEDIFF(l.to_date, l.from_date) >= td.d 
ORDER BY 
    e.id 
+0

它的工作......谢谢!!!! – Java 2012-02-20 12:08:10

+0

这是一个非常简单的方法。我感觉非常愚蠢,因为我一直使用JOIN预填充“日期”表。 – nnichols 2012-02-20 12:31:27

+0

还有一件事,如果我想显示这个输出的特定状态,如状态是'Approved',那么只显示记录,在这种情况下如何写入查询?(请参见离开表) – Java 2012-02-20 12:31:44