mysql选择没有表的日期

时间:2011-02-22 17:31:11

标签: mysql

我只需要在一个月内返回所有日期的列表。我没有访问特定的表。因此,如果给定2月份,我需要一个sql select语句,返回以下内容:

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

这应该是相当简单的,我想,如果我知道我需要做的sql select语句。这个月应该是可选择的,我会从网页选择框传递它,让用户选择月份和年份。这将成为报告的基础。我已经有了一个select语句,它将花费每一天并对与这些日期相关的记录进行计数,但我需要此表作为我的报告的基础。

3 个答案:

答案 0 :(得分: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"

答案 1 :(得分:1)

- 这可能有点矫枉过正,但你可以做一个这样的程序:

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');

答案 2 :(得分:0)

我略微增加了上个月的所有上一个日期:

SELECT(选择日期(NOW() - INTERVAL 1个月))+ INTERVAL a + b DAY dte 从  (选择0一个UNION SELECT 1一个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,  (选择0 b UNION SELECT 10 UNION SELECT 20     UNION SELECT 30 UNION SELECT 40)m WHERE(选择日期(NOW() - INTERVAL 1个月))+ INTERVAL a + b DAY&lt; (选择日期(now())) 按a + b排序;