特定の月の日をリストするためのMySQLの関数の選択はありますか?
アップデート
私はこのリストのようなものを持っている必要があります:
|day|
|1 |
|2 |
|3 |
|. |
|. |
|30 |
|31 |
これは、クエリ文字列を生成して日のリストを作成するための純粋な 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 つの例を次に示します。
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>
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>
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>
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>
試してみる !!!
を使用してみて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
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');