2011-02-22 70 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;