2015-12-22 82 views
4

我有表得到所有日期在當月

userID | date | time 
=================== 
1 | 2015-02-08 | 06:32 
1 | 2015-02-08 | 05:36 
1 | 2015-02-08 | 17:43 
1 | 2015-02-08 | 18:00 
1 | 2015-02-09 | 06:36 
1 | 2015-02-09 | 15:43 
1 | 2015-02-09 | 19:00 
1 | 2015-02-10 | 05:36 
1 | 2015-02-10 | 17:43 
1 | 2015-02-10 | 18:00 
2 | 2015-02-08 | 06:32 
2 | 2015-02-08 | 05:36 
2 | 2015-02-08 | 17:43 
2 | 2015-02-08 | 18:00 
2 | 2015-02-09 | 06:36 
2 | 2015-02-09 | 15:43 
2 | 2015-02-09 | 19:00 
2 | 2015-02-10 | 05:36 
2 | 2015-02-10 | 17:43 
2 | 2015-02-10 | 18:00 

但我想的返回記錄的數量是完全一樣當月的天數,並獲得分鐘的時間在和最大時間了。如果當月有28天,只有兩個記錄應該攜帶:

userID | date | in | out 
======================== 
1 | 2015-02-01 | | 
1 | 2015-02-02 | | 
1 | 2015-02-03 | | 
1 | 2015-02-04 | | 
1 | 2015-02-05 | | 
1 | 2015-02-06 | | 
1 | 2015-02-07 | | 
1 | 2015-02-08 | 06:32 | 18:00 
1 | 2015-02-09 | 06:36 | 19:00 
1 | 2015-02-10 | 05:36 | 18:00 
1 | 2015-02-11 | | 
1 | 2015-02-12 | | 
1 | 2015-02-13 | | 
1 | 2015-02-14 | | 
1 | 2015-02-15 | | 
1 | 2015-02-16 | | 
1 | 2015-02-17 | | 
1 | 2015-02-18 | | 
1 | 2015-02-19 | | 
1 | 2015-02-20 | | 
1 | 2015-02-21 | | 
1 | 2015-02-22 | | 
1 | 2015-02-23 | | 
1 | 2015-02-24 | | 
1 | 2015-02-25 | | 
1 | 2015-02-26 | | 
1 | 2015-02-27 | | 
1 | 2015-02-28 | | 

如何修改我的查詢來達到以上的結果?
這是我的查詢:

$sql = "SELECT 
        colUserID, 
        colDate, 
        if(min(colJam) < '12:00:00',min(colJam), '') as in, 
        if(max(colJam) > '12:00:00',max(colJam), '') as out 
       FROM tb_kehadiran 
        WHERE colDate > DATE_ADD(MAKEDATE($tahun, 31), 
        INTERVAL($bulan-2) MONTH) 
        AND 
        colDate < DATE_ADD(MAKEDATE($tahun, 1), 
        INTERVAL($bulan) MONTH) 
        AND 
        colUserID = $user_id 
     GROUP BY colUserID,colDate"; 
+0

爲什麼TAG插入sql? –

+0

只能插入mysql標籤。 –

+1

@DenishParvadia爲什麼不呢?他們要求爲MySQL dbms提供一個SQL查詢。 –

回答

-1

您需要三樣東西:

  • 日期清單。
  • 左連接
  • 聚集

所以:

select d.dte, min(t.time), max(t.time) 
from (select date('2015-02-01') as dte union all 
     select date('2015-02-02') union all 
     . . 
     select date('2015-02-28') 
    ) d left join 
    t 
    on d.dte = t.date 
group by d.dte 
order by d.dte; 
+4

這是一個不好的答案。硬編碼日期僅適用於硬編碼日期。 –

+0

@Peter_James。 。 。如果您有另一種方法來生成OP請求的所有日期,那麼您應該將其包含在答案中。 –

+0

匿名downvoters,我有點好奇,爲什麼這個答案會吸引這麼多downvotes(以及upvotes - 選民總數驚人地大)。 –

-4

嘗試此查詢

SELECT `date`, MIN(`time`) as `IN`, MAX('time') AS `OUT` 
    FROM `table_name` WHERE month(current_date) = month(`date`) 
    GROUP BY `date`; 
+0

這個查詢沒有得到所有月份的日期 –

-1

試試這個

set @is_first_date = 0; 
set @temp_start_date = date('2015-02-01'); 
set @temp_end_date = date('2015-02-28'); 

select my_dates.date,your_table_name.user_id, MIN(your_table_name.time), MAX(your_table_name.time) from 
(select if(@is_first_date , @temp_start_date := DATE_ADD(@temp_start_date, interval 1 day), @temp_start_date) as date,@is_first_date:[email protected]_first_date+1 as start_date from information_schema.COLUMNS 
where @temp_start_date < @temp_end_date limit 0, 31 
) my_dates left join your_table_name on 
my_dates.date = your_table_name.date 
group by my_dates.date 
0

我不得不想這個。不過,也許simpliest答案至今:

WITH AllMonthDays as (
    SELECT n = 1 
    UNION ALL 
    SELECT n + 1 FROM AllMonthDays WHERE n + 1 <= DAY(EOMONTH(GETDATE())) 
) 

SELECT 
    DISTINCT datefromparts(YEAR(GETDATE()), MONTH(GETDATE()), n) As dates 
    , MIN(d.time) as 'In' 
    , MAX(d.time) as 'Out' 
FROM AllMonthDays as A 
    LEFT OUTER JOIN 
    table as d on 
     DAY(d.date) = A.n 
GROUP BY n,(d.date); 

---試驗和在這個環境中嘗試:---

use Example; 
CREATE TABLE demo (
    ID int identity(1,1) 
    ,date date 
    ,time time 
    ); 

INSERT INTO demo (date, time) VALUES 
    ('2015-12-08', '06:32'), 
    ('2015-12-08', '05:36'), 
    ('2015-12-08', '17:43'), 
    ('2015-12-08', '18:00'), 
    ('2015-12-09', '06:36'), 
    ('2015-12-09', '15:43'), 
    ('2015-12-09', '19:00'), 
    ('2015-12-10', '05:36'), 
    ('2015-12-10', '17:43'), 
    ('2015-12-10', '18:00') 
    ; 

WITH AllMonthDays as (
    SELECT n = 1 
    UNION ALL 
    SELECT n + 1 FROM AllMonthDays WHERE n + 1 <= DAY(EOMONTH(GETDATE())) 
) 

SELECT 
    DISTINCT datefromparts(YEAR(GETDATE()), MONTH(GETDATE()), n) As dates 
    , MIN(d.time) as 'In' 
    , MAX(d.time) as 'Out' 
FROM AllMonthDays as A 
    LEFT OUTER JOIN 
    demo as d on 
     DAY(d.date) = A.n 
GROUP BY n,(d.date); 

DROP table demo; 
+1

你的確意識到這個問題被標記爲MySQL,而你的代碼與MySQL無關。 –

0

我已經在過去走近這個問題的方法是有一個日期表,未來幾年會預先填充。

您可以創建這樣的表格,可能會定義年份,月份和日期的列,並在年份和月份使用索引。

然後,您可以使用此表對您的數據加入JOIN,以確保所有日期都存在於您的結果中。

相關問題