MySQL获取某个月份、年份的日期列表

6

我正在编写一些报告,需要获取特定月份的所有日期,例如2014年1月。当我运行以下'SQL'语句时:

SELECT datesInMonth WHERE month = 1 AND year = 2014;

我想获取这个列表:

    2014-01-01
    2014-01-02
    2014-01-03
    ...
    2014-01-31

如果我执行这个“SQL”语句:

SELECT datesInMonth WHERE month = 2 AND year = 2014;

我想获取这个列表:

    2014-02-01
    2014-02-02
    2014-02-03
    ...
    2014-02-28

如果我这样写 'SQL':
SELECT datesInMonth WHERE month = 2 AND year = 2016;

我想获取这个列表:
    2016-02-01
    2016-02-02
    2016-02-03
    ...
    2016-02-29

这是否可能,还是我应该自己做一张包含未来100年日期的表格呢 :)

你可以利用 UNION 的巧妙技巧,或者在应用程序级别处理业务逻辑。但是你的另一个想法也是可以的。一个包含未来1000年日期的日历表会很小。 - Strawberry
是的,这可以解决我的问题100年,但如果有更好的解决方案,我想要它。 - AdrianES
1
您可能需要像这里的过程。它创建了一个表,但您也可以返回一个结果集 - http://schimpf.es/generate-a-list-between-two-dates-in-mysql/ - Shiva
@Strawberry,为什么不在100年后再来,到时候我们再看你是否有更好的评论呢? - AdrianES
谢谢 @Shiva,我会尝试的。 - AdrianES
2个回答

2
这里是针对此问题的mysql/java解决方案。
创建表语句:
CREATE TABLE `date_table` (
  `ID` bigint(20) NOT NULL AUTO_INCREMENT,
  `date` date NOT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;

Java代码:

public static void main(String[] args) throws ClassNotFoundException, SQLException {
        Database db = new Database("root", "root01", "test-db", "10.10.5.11");
        db.connect();
        int start_year = 2013;
        int end_year = 2100;
        for (int year = start_year; year < end_year; year++) {
            for (int month = 1; month <= 12; month++) {
                int days_in_month = 0;
                switch (month) {
                    case 1: { //January
                        days_in_month = 31;
                        break;
                    }
                    case 2: { //February
                        if (year % 4 == 0) {
                            days_in_month = 29;
                        } else {
                            days_in_month = 28;
                        }
                        break;
                    }
                    case 3: { //March
                        days_in_month = 31;
                        break;
                    }
                    case 4: { //April
                        days_in_month = 30;
                        break;
                    }
                    case 5: { //May
                        days_in_month = 31;
                        break;
                    }
                    case 6: { //June
                        days_in_month = 30;
                        break;
                    }
                    case 7: { //July
                        days_in_month = 31;
                        break;
                    }
                    case 8: { //August
                        days_in_month = 31;
                        break;
                    }
                    case 9: { //September
                        days_in_month = 30;
                        break;
                    }
                    case 10: { //October
                        days_in_month = 31;
                        break;
                    }
                    case 11: { //November
                        days_in_month = 30;
                        break;
                    }
                    case 12: { //December
                        days_in_month = 31;
                        break;
                    }
                }
                for (int day = 1; day <= days_in_month; day++) {
                    db.executeInsert("INSERT INTO date_table (date) VALUES ('" + year + "-" + month + "-" + day + "');");
                }
            }
            System.out.println("YEAR: " + year + " FINISHED");
        }
    }

我使用以下SQL获取日期列表:

SELECT * FROM date_table WHERE YEAR(date) = 2014 AND MONTH(date) = 2;

希望有人能使用它 :)

1
你可以在MySQL中使用datetime function。特别是MONTH()和YEAR()函数。如果你将一个日期传递给这些函数,它将返回月份或年份。例如:
WHERE MONTH(my_date) = 2 and YEAR(my_date) = 2014

如果您想获取一个月内的所有日期,可以像这样操作:
SELECT my_date FROM my_table
WHERE MONTH(my_date) = 2 and YEAR(my_date) = 2014

他们可以使用我的 WHERE 语句来实现。 - Damien Black
如果我创建日期表,我将使用例如'SELECT DATE(full_date) WHERE MONTH(full_date) = 2 AND YEAR(full_date) = 2014',但这是我的第二选择。 - AdrianES

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接