首页 文章

mysql选择没有表的日期

提问于
浏览
10

我只需要在一个月内返回所有日期的列表 . 我没有访问特定的表 . 所以如果给定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 回答

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

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

    SELECT(SELECT Date(NOW() - INTERVAL 1 MONTH))INTERVAL ab DAY DATE 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(选择日期(NOW() - INTERVAL 1 MONTH))INTERVAL ab DAY <(选择日期(now()))订购BY ab;

相关问题