我只需要在一个月内返回所有日期的列表。我没有访问特定的表。因此,如果给定2月份,我需要一个sql select语句,返回以下内容:
Day
----
2011-02-01
2011-02-02
2011-02-03
... etc, etc.
2011-02-27
2011-02-28
这应该是相当简单的,我想,如果我知道我需要做的sql select语句。这个月应该是可选择的,我会从网页选择框传递它,让用户选择月份和年份。这将成为报告的基础。我已经有了一个select语句,它将花费每一天并对与这些日期相关的记录进行计数,但我需要此表作为我的报告的基础。
答案 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排序;