2011-02-22 120 views
10

我只需要返回一個月內所有日期的列表。我沒有訪問特定的表格。所以我需要一個SQL SELECT語句,如果給出的二月份,返回如下:mysql select date without tables

Day 
---- 
2011-02-01 
2011-02-02 
2011-02-03 
... etc, etc. 
2011-02-27 
2011-02-28 

這應該是相當簡單的,我會想,如果我知道SQL SELECT語句我需要做。該月份應該是可選的,我會從網頁選擇框中通過它,讓用戶選擇月份和年份。這將成爲報告的基礎。我已經有了一份選擇聲明,將每一天都記錄下來,並記錄與這些日期相關的記錄,但我需要這張表作爲我的報告的基礎。

+3

如果你沒有訪問表,那麼你使用SQL呢? – Val 2011-02-22 17:34:38

+0

爲什麼不用你的編程語言來做 - 可能要簡單得多。 – Knubo 2011-02-22 17:36:55

+0

出於好奇,爲什麼需要在sql中完成?似乎是一個尷尬的請求,更容易在您選擇的腳本語言中完成。 – 2011-02-22 17:37:16

回答

16

我同意評論意見,這樣的事情不應該在數據庫中完成,但在技術上是可行的。 如果你給的開始和結束日期,如果增加額外的數子查詢必要的:

SELECT '2011-02-01' + INTERVAL a + b DAY dte 
FROM 
(SELECT 0 a UNION SELECT 1 a UNION SELECT 2 UNION SELECT 3 
    UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 
    UNION SELECT 8 UNION SELECT 9) d, 
(SELECT 0 b UNION SELECT 10 UNION SELECT 20 
    UNION SELECT 30 UNION SELECT 40) m 
WHERE '2011-02-01' + INTERVAL a + b DAY < '2011-03-01' 
ORDER BY a + b 

結果:

"2011-02-01" 
"2011-02-02" 
"2011-02-03" 
.... 
"2011-02-28" 
0

- 這可能是矯枉過正,但你可以做這樣一個過程:

use dbname; 

DELIMITER $$ 

DROP PROCEDURE IF EXISTS `days_of_month` $$ 

CREATE PROCEDURE `days_of_month`(iDate DATETIME) DETERMINISTIC 

BEGIN 

    DECLARE last_day,mm,yy,dd INT DEFAULT 0; 
    SET dd = 1; 
    SET mm = month(iDate); 
    SET yy = year(iDate); 

    set iDate = case when iDate is null then now() else iDate end; 
    SET last_day = date_format(LAST_DAY(iDate),'%d'); 

    DROP TABLE IF EXISTS `days_of_month_tblTemp`; 
    CREATE TEMPORARY TABLE days_of_month_tblTemp(tmpDate DATE); 

    label1: LOOP 
     insert into days_of_month_tblTemp(tmpDate) values (concat(yy,'-',mm,'-',dd)); 
     SET dd = dd + 1; 
     IF dd < (last_day+1) THEN ITERATE label1; END IF; 
     LEAVE label1; 
     END LOOP label1; 
     SELECT * from days_of_month_tblTemp; 
END $$ 

DELIMITER ; 

- 這樣運行:CALL DAYS_OF_MONTH( '2012-02-22');

0

我已經稍微增加了一些給上個月的所有前述日期:

SELECT(SELECT日期(NOW() - 時間間隔1個月))+間隔A + B DAY DTE FROM (選擇0 a UNION SELECT 1 a UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9)d, (SELECT 0 b UNION SELECT 10 UNION SELECT 20 UNION SELECT 30 UNION SELECT 40)m WHERE(SELECT Date(NOW() - INTERVAL 1 MONTH))+ INTERVAL a + b DAY <(select date(now())) ORDER BY a + b;