1

特定の月の日をリストするためのMySQLの関数の選択はありますか?

アップデート

私はこのリストのようなものを持っている必要があります:

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

3 に答える 3

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 を設定して実行する 4 つの例を次に示します。

例 1 : 2012 年 2 月 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 年 6 月 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>

試してみる !!!

于 2012-07-11T17:46:24.753 に答える
0

を使用してみて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

于 2012-07-11T16:26:15.617 に答える
0

0 から約 100 までのすべての整数を含む range という名前のテーブルがあります。次のようなクエリに役立ちます。

SELECT '2012-07-01' + INTERVAL nr day AS day 
FROM test.range 
WHERE nr < 32 
HAVING MONTH(day) = MONTH('2012-07-01');
于 2012-07-11T17:02:57.820 に答える