【问题标题】:MySQL - how to determine list of days of any given monthMySQL - 如何确定任何给定月份的日期列表
【发布时间】:2012-07-11 16:18:31
【问题描述】:

是否有一个 MySQL 选择函数来列出任何给定月份的日期?

更新

我需要这样的清单:

|day|
|1  |
|2  |
|3  |
|.  |
|.  |
|30 |
|31 |

【问题讨论】:

  • 阅读 this 并尝试找出解决方案。如果遇到困难,请寻求帮助...
  • 谢谢,我已经读过了...
  • 好的,然后向我们展示您尝试过的查询以及您遇到的问题。

标签: mysql calendar days


【解决方案1】:

这是一个纯 MySQL 解决方案,用于生成查询字符串以制作天数列表

SET @GivenDate = '2012-02-26';
SELECT DAY(CONCAT(DATE_FORMAT(dt28 + INTERVAL 4 DAY,
'%Y-%m'),'-01') - INTERVAL 1 DAY) - 27 INTO @DaysAfter27
FROM (SELECT CONCAT(DATE_FORMAT(dt,'%Y-%m'),'-28') dt28
FROM (SELECT @GivenDate dt) AA) A;
SELECT ELT(@DaysAfter27,' UNION (SELECT 28)',
' UNION (SELECT 28) UNION (SELECT 29)',
' UNION (SELECT 28) UNION (SELECT 29) UNION (SELECT 30)',
' UNION (SELECT 28) UNION (SELECT 29) UNION (SELECT 30) UNION (SELECT 31)')
INTO @DaysEndOfList;
SELECT CONCAT('SELECT * FROM',
' ((SELECT 1 Days) UNION (SELECT 2) UNION (SELECT 3)'
' UNION (SELECT  4) UNION (SELECT  5) UNION (SELECT  6)',
' UNION (SELECT  7) UNION (SELECT  8) UNION (SELECT  9)',
' UNION (SELECT 10) UNION (SELECT 11) UNION (SELECT 12)',
' UNION (SELECT 13) UNION (SELECT 14) UNION (SELECT 15)',
' UNION (SELECT 16) UNION (SELECT 17) UNION (SELECT 18)',
' UNION (SELECT 19) UNION (SELECT 20) UNION (SELECT 21)',
' UNION (SELECT 22) UNION (SELECT 23) UNION (SELECT 24)',
' UNION (SELECT 25) UNION (SELECT 26) UNION (SELECT 27)',
@DaysEndOfList,') A') INTO @DaysQuery;
PREPARE s1 FROM @DaysQuery;
EXECUTE s1;
DEALLOCATE PREPARE s1;

只需将@GivenDate 设置为您喜欢的任何日期

这是我设置@GivenDate 并执行它的四个示例

示例 1:2012-02-26

mysql> SET @GivenDate = '2012-02-26';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT DAY(CONCAT(DATE_FORMAT(dt28 + INTERVAL 4 DAY,
    -> '%Y-%m'),'-01') - INTERVAL 1 DAY) - 27 INTO @DaysAfter27
    -> FROM (SELECT CONCAT(DATE_FORMAT(dt,'%Y-%m'),'-28') dt28
    -> FROM (SELECT @GivenDate dt) AA) A;
Query OK, 1 row affected (0.00 sec)

mysql> SELECT ELT(@DaysAfter27,' UNION (SELECT 28)',
    -> ' UNION (SELECT 28) UNION (SELECT 29)',
    -> ' UNION (SELECT 28) UNION (SELECT 29) UNION (SELECT 30)',
    -> ' UNION (SELECT 28) UNION (SELECT 29) UNION (SELECT 30) UNION (SELECT 31)')
    -> INTO @DaysEndOfList;
Query OK, 1 row affected (0.00 sec)

mysql> SELECT CONCAT('SELECT * FROM',
    -> ' ((SELECT 1 Days) UNION (SELECT 2) UNION (SELECT 3)'
    -> ' UNION (SELECT  4) UNION (SELECT  5) UNION (SELECT  6)',
    -> ' UNION (SELECT  7) UNION (SELECT  8) UNION (SELECT  9)',
    -> ' UNION (SELECT 10) UNION (SELECT 11) UNION (SELECT 12)',
    -> ' UNION (SELECT 13) UNION (SELECT 14) UNION (SELECT 15)',
    -> ' UNION (SELECT 16) UNION (SELECT 17) UNION (SELECT 18)',
    -> ' UNION (SELECT 19) UNION (SELECT 20) UNION (SELECT 21)',
    -> ' UNION (SELECT 22) UNION (SELECT 23) UNION (SELECT 24)',
    -> ' UNION (SELECT 25) UNION (SELECT 26) UNION (SELECT 27)',
    -> @DaysEndOfList,') A') INTO @DaysQuery;
Query OK, 1 row affected (0.00 sec)

mysql> PREPARE s1 FROM @DaysQuery;
Query OK, 0 rows affected (0.00 sec)
Statement prepared

mysql> EXECUTE s1;
+------+
| Days |
+------+
|    1 |
|    2 |
|    3 |
|    4 |
|    5 |
|    6 |
|    7 |
|    8 |
|    9 |
|   10 |
|   11 |
|   12 |
|   13 |
|   14 |
|   15 |
|   16 |
|   17 |
|   18 |
|   19 |
|   20 |
|   21 |
|   22 |
|   23 |
|   24 |
|   25 |
|   26 |
|   27 |
|   28 |
|   29 |
+------+
29 rows in set (0.00 sec)

mysql> DEALLOCATE PREPARE s1;
Query OK, 0 rows affected (0.00 sec)

mysql>

示例 2:2011-02-26

mysql> SET @GivenDate = '2011-02-26';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT DAY(CONCAT(DATE_FORMAT(dt28 + INTERVAL 4 DAY,
    -> '%Y-%m'),'-01') - INTERVAL 1 DAY) - 27 INTO @DaysAfter27
    -> FROM (SELECT CONCAT(DATE_FORMAT(dt,'%Y-%m'),'-28') dt28
    -> FROM (SELECT @GivenDate dt) AA) A;
Query OK, 1 row affected (0.00 sec)

mysql> SELECT ELT(@DaysAfter27,' UNION (SELECT 28)',
    -> ' UNION (SELECT 28) UNION (SELECT 29)',
    -> ' UNION (SELECT 28) UNION (SELECT 29) UNION (SELECT 30)',
    -> ' UNION (SELECT 28) UNION (SELECT 29) UNION (SELECT 30) UNION (SELECT 31)')
    -> INTO @DaysEndOfList;
Query OK, 1 row affected (0.00 sec)

mysql> SELECT CONCAT('SELECT * FROM',
    -> ' ((SELECT 1 Days) UNION (SELECT 2) UNION (SELECT 3)'
    -> ' UNION (SELECT  4) UNION (SELECT  5) UNION (SELECT  6)',
    -> ' UNION (SELECT  7) UNION (SELECT  8) UNION (SELECT  9)',
    -> ' UNION (SELECT 10) UNION (SELECT 11) UNION (SELECT 12)',
    -> ' UNION (SELECT 13) UNION (SELECT 14) UNION (SELECT 15)',
    -> ' UNION (SELECT 16) UNION (SELECT 17) UNION (SELECT 18)',
    -> ' UNION (SELECT 19) UNION (SELECT 20) UNION (SELECT 21)',
    -> ' UNION (SELECT 22) UNION (SELECT 23) UNION (SELECT 24)',
    -> ' UNION (SELECT 25) UNION (SELECT 26) UNION (SELECT 27)',
    -> @DaysEndOfList,') A') INTO @DaysQuery;
Query OK, 1 row affected (0.00 sec)

mysql> PREPARE s1 FROM @DaysQuery;
Query OK, 0 rows affected (0.00 sec)
Statement prepared

mysql> EXECUTE s1;
+------+
| Days |
+------+
|    1 |
|    2 |
|    3 |
|    4 |
|    5 |
|    6 |
|    7 |
|    8 |
|    9 |
|   10 |
|   11 |
|   12 |
|   13 |
|   14 |
|   15 |
|   16 |
|   17 |
|   18 |
|   19 |
|   20 |
|   21 |
|   22 |
|   23 |
|   24 |
|   25 |
|   26 |
|   27 |
|   28 |
+------+
28 rows in set (0.00 sec)

mysql> DEALLOCATE PREPARE s1;
Query OK, 0 rows affected (0.01 sec)

mysql>

示例 3:今天 (2012-07-11)

mysql> SET @GivenDate = DATE(NOW());
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT DAY(CONCAT(DATE_FORMAT(dt28 + INTERVAL 4 DAY,
    -> '%Y-%m'),'-01') - INTERVAL 1 DAY) - 27 INTO @DaysAfter27
    -> FROM (SELECT CONCAT(DATE_FORMAT(dt,'%Y-%m'),'-28') dt28
    -> FROM (SELECT @GivenDate dt) AA) A;
Query OK, 1 row affected (0.00 sec)

mysql> SELECT ELT(@DaysAfter27,' UNION (SELECT 28)',
    -> ' UNION (SELECT 28) UNION (SELECT 29)',
    -> ' UNION (SELECT 28) UNION (SELECT 29) UNION (SELECT 30)',
    -> ' UNION (SELECT 28) UNION (SELECT 29) UNION (SELECT 30) UNION (SELECT 31)')
    -> INTO @DaysEndOfList;
Query OK, 1 row affected (0.00 sec)

mysql> SELECT CONCAT('SELECT * FROM',
    -> ' ((SELECT 1 Days) UNION (SELECT 2) UNION (SELECT 3)'
    -> ' UNION (SELECT  4) UNION (SELECT  5) UNION (SELECT  6)',
    -> ' UNION (SELECT  7) UNION (SELECT  8) UNION (SELECT  9)',
    -> ' UNION (SELECT 10) UNION (SELECT 11) UNION (SELECT 12)',
    -> ' UNION (SELECT 13) UNION (SELECT 14) UNION (SELECT 15)',
    -> ' UNION (SELECT 16) UNION (SELECT 17) UNION (SELECT 18)',
    -> ' UNION (SELECT 19) UNION (SELECT 20) UNION (SELECT 21)',
    -> ' UNION (SELECT 22) UNION (SELECT 23) UNION (SELECT 24)',
    -> ' UNION (SELECT 25) UNION (SELECT 26) UNION (SELECT 27)',
    -> @DaysEndOfList,') A') INTO @DaysQuery;
Query OK, 1 row affected (0.00 sec)

mysql> PREPARE s1 FROM @DaysQuery;
Query OK, 0 rows affected (0.00 sec)
Statement prepared

mysql> EXECUTE s1;
+------+
| Days |
+------+
|    1 |
|    2 |
|    3 |
|    4 |
|    5 |
|    6 |
|    7 |
|    8 |
|    9 |
|   10 |
|   11 |
|   12 |
|   13 |
|   14 |
|   15 |
|   16 |
|   17 |
|   18 |
|   19 |
|   20 |
|   21 |
|   22 |
|   23 |
|   24 |
|   25 |
|   26 |
|   27 |
|   28 |
|   29 |
|   30 |
|   31 |
+------+
31 rows in set (0.00 sec)

mysql> DEALLOCATE PREPARE s1;
Query OK, 0 rows affected (0.00 sec)

mysql>

示例 4:2012-06-26:

mysql> SET @GivenDate = '2012-06-26';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT DAY(CONCAT(DATE_FORMAT(dt28 + INTERVAL 4 DAY,
    -> '%Y-%m'),'-01') - INTERVAL 1 DAY) - 27 INTO @DaysAfter27
    -> FROM (SELECT CONCAT(DATE_FORMAT(dt,'%Y-%m'),'-28') dt28
    -> FROM (SELECT @GivenDate dt) AA) A;
Query OK, 1 row affected (0.00 sec)

mysql> SELECT ELT(@DaysAfter27,' UNION (SELECT 28)',
    -> ' UNION (SELECT 28) UNION (SELECT 29)',
    -> ' UNION (SELECT 28) UNION (SELECT 29) UNION (SELECT 30)',
    -> ' UNION (SELECT 28) UNION (SELECT 29) UNION (SELECT 30) UNION (SELECT 31)')
    -> INTO @DaysEndOfList;
Query OK, 1 row affected (0.00 sec)

mysql> SELECT CONCAT('SELECT * FROM',
    -> ' ((SELECT 1 Days) UNION (SELECT 2) UNION (SELECT 3)'
    -> ' UNION (SELECT  4) UNION (SELECT  5) UNION (SELECT  6)',
    -> ' UNION (SELECT  7) UNION (SELECT  8) UNION (SELECT  9)',
    -> ' UNION (SELECT 10) UNION (SELECT 11) UNION (SELECT 12)',
    -> ' UNION (SELECT 13) UNION (SELECT 14) UNION (SELECT 15)',
    -> ' UNION (SELECT 16) UNION (SELECT 17) UNION (SELECT 18)',
    -> ' UNION (SELECT 19) UNION (SELECT 20) UNION (SELECT 21)',
    -> ' UNION (SELECT 22) UNION (SELECT 23) UNION (SELECT 24)',
    -> ' UNION (SELECT 25) UNION (SELECT 26) UNION (SELECT 27)',
    -> @DaysEndOfList,') A') INTO @DaysQuery;
Query OK, 1 row affected (0.00 sec)

mysql> PREPARE s1 FROM @DaysQuery;
Query OK, 0 rows affected (0.00 sec)
Statement prepared

mysql> EXECUTE s1;
+------+
| Days |
+------+
|    1 |
|    2 |
|    3 |
|    4 |
|    5 |
|    6 |
|    7 |
|    8 |
|    9 |
|   10 |
|   11 |
|   12 |
|   13 |
|   14 |
|   15 |
|   16 |
|   17 |
|   18 |
|   19 |
|   20 |
|   21 |
|   22 |
|   23 |
|   24 |
|   25 |
|   26 |
|   27 |
|   28 |
|   29 |
|   30 |
+------+
30 rows in set (0.00 sec)

mysql> DEALLOCATE PREPARE s1;
Query OK, 0 rows affected (0.00 sec)

mysql>

试试看!!!

【讨论】:

    【解决方案2】:

    尝试使用LAST_DAY('0000-00-00'),并从您的首选语言 (PHP/ASP/WHATEVER) 循环从最后一天到第一天。

    LAST_DAY()

    获取日期或日期时间值并返回对应的值 一个月的最后一天

    发件人:http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_last-day

    【讨论】:

    • 让OP自己先试试。 SO 不仅仅是为了提供帮助。让 OP 试试看他能学到什么。勺子喂养不好。
    • DAY(LAST_DAY()) 只给你 31
    • 这是我没有在答案中添加代码的原因之一。我只给他指明了方向。
    • @PugganSe :如果我说这个月的最后一个日期是 31,那么显然你会说这个月有 31 天。有任何疑问吗?
    • @PugganSe DAY(LAST_DAY()) 做同样的事情 LAST_DAY(),但使用不明确的 DAY()
    【解决方案3】:

    我有一个名为 range 的表,其中包含从 0 到大约 100 的所有整数。 它对这样的查询很有用:

    SELECT '2012-07-01' + INTERVAL nr day AS day 
    FROM test.range 
    WHERE nr < 32 
    HAVING MONTH(day) = MONTH('2012-07-01');
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-21
      • 2023-03-05
      • 1970-01-01
      相关资源
      最近更新 更多