MYSQLでの日付比較演算子の確認

## 月跨ぎでページがエラーになってしまっていた。


$query = "select GET_D,TRUNCATE(avg(TAKEN),2) AVGT from T_Confirmation
where GET_D > CURDATE() - 8 group by GET_D";

## DB側にてデータの確認

mysql> select GET_D,TRUNCATE(avg(TAKEN),2) AVGT from T_Confirmation
where GET_D > CURDATE() - 8 group by GET_D;
Empty set, 1 warning (0.02 sec)

## データはあるので、where句の部分を確認。
## 実際にQueryを実行してみると以下のような日付が返ってきた。


mysql>select CURDATE() - 8;
+---------------+
| CURDATE() - 8 |
+---------------+
| 20100893 |
+---------------+
1 row in set (0.00 sec)


mysql> select CURRENT_DATE() - 8;
+--------------------+
| CURRENT_DATE() - 8 |
+--------------------+
| 20100893 |
+--------------------+
1 row in set (0.00 sec)

## 日付の表示を正しいものに修正する為に、DATA_ADDを利用する事にした。

mysql> SELECT DATE_ADD(CURRENT_DATE,INTERVAL 8 DAY);
+—————————————+
| DATE_ADD(CURRENT_DATE,INTERVAL 8 DAY) |
+—————————————+
| 2010-09-09 |
+—————————————+
1 row in set (0.00 sec)

mysql> SELECT DATE_ADD(CURRENT_DATE,INTERVAL -8 DAY);
+—————————————-+
| DATE_ADD(CURRENT_DATE,INTERVAL -8 DAY) |
+—————————————-+
| 2010-08-24 |
+—————————————-+
1 row in set (0.00 sec)

mysql>

## 正しくデータが表示される事を確認

mysql> select GET_D,TRUNCATE(avg(TAKEN),2) AVGT from T_Confirmationwhere GET_D > DATE_ADD(CURRENT_DATE,INTERVAL -8 DAY) group by GET_D;
+————+——+
| GET_D | AVGT |
+————+——+
| 2010-08-25 | 0.77 |
| 2010-08-26 | 0.48 |
| 2010-08-27 | 0.32 |
| 2010-08-28 | 0.30 |
| 2010-08-29 | 0.28 |
| 2010-08-30 | 0.35 |
| 2010-08-31 | 0.34 |
+————+——+
7 rows in set (0.02 sec)

mysql>


select substring(GET_T,1,2) as GET_T,COUNT(*) as TOTAL from
T_Confirmation where MONTH(GET_D)= MONTH(DATE_ADD(CURRENT_DATE,INTERVAL -1 DAY))
AND TAKEN >= 10 Group by substring(GET_T,1,2);

MONTH(DATE_ADD(CURRENT_DATE,INTERVAL -1 DAY))

## 全てのPHPファイルを修正する為に、ワンライナーで一気に書き換えで終了。
## ワンライナーでフォルダー配下のPHPを全て修正して解決!!

perl -pi -e 's/CURDATE\(\) - 8/DATE_ADD\(CURRENT_DATE,INTERVAL -8 DAY\)/' *.php


DBの管理をしていると、日付を指定してデータを取得する事が多々あります。
MS SQLの時は、CAST, CONVERTなどで日付を成形して指定された日付のデータ
を取得しておりましたが、MYSQLではこのDATE_FORMAT()やTIME_FORMAT()
を利用すると比較的簡単にデータの操作が出来ます。

——————————————————————————————————
日付関数の使用例を次に示します。このクエリでは、過去 30 日以内の日付の
date_col 値を持つすべてのレコードが選択されます。

mysql> SELECT something FROM tbl_name
WHERE TO_DAYS(NOW()) – TO_DAYS(date_col) <= 30; ------------------------------------------------------------------------------------------------------

DATE_FORMAT


mysql> SELECT
-> DATE_FORMAT(CurDate(),'%Y') as year ,
-> DATE_FORMAT(CurDate(),'%m') as month ,
-> DATE_FORMAT(CurDate(),'%d') as day;
+------+-------+------+
| year | month | day |
+------+-------+------+
| 2009 | 07 | 14 |
+------+-------+------+
1 row in set (0.00 sec)

mysql>
mysql> SELECT
-> DATE_FORMAT(CurDate(),'%Y年') as '年',
-> DATE_FORMAT(CurDate(),'%Y年%m月') as '年月',
-> DATE_FORMAT(CurDate(),'%Y年%m月%d日') as '年月日';
+--------+------------+----------------+
| 年 | 年月 | 年月日 |
+--------+------------+----------------+
| 2009年 | 2009年07月 | 2009年07月14日 |
+--------+------------+----------------+
1 row in set (0.00 sec)

mysql>

data_format

————————————————————————————————–
指定子 概要
————————————————————————————————–
%M 月の名前(January..December)
%W 曜日名(Sunday..Saturday)
%D 英語のサフィックス付きの日付(0th、1st、2nd、3rd など)
%Y 4 桁の数値で表した年
%y 2 桁の数値で表した年
%X 日曜日を週の最初の日とした場合の週に使用する、4 桁の数値で表した年%V と組み合わせて使用
%x 月曜日を週の最初の日とした場合の週に使用する、4 桁の数値で表した年%v と組み合わせて使用
%a 略式の曜日名(Sun..Sat)
%d 数値で表した日付(00..31)
%e 数値で表した日付(0..31)
%m 数値で表した月(00..12)
%c 数値で表した月(0..12)
%b 略式の月名(Jan..Dec)
%j 年間を通した日にち(001..366)
%H 時(00..23)
%k 時(0..23)
%h 時(01..12)
%I 時(01..12)
%l 時(1..12)
%i 数値で表した分(00..59)
%r 12 時間形式の時刻(hh:mm:ss に続けて AM または PM)
%T 24 時間形式の時刻(hh:mm:ss)
%S 秒(00..59)
%s 秒(00..59)
%f マイクロ秒(000000..999999)
%p AM または PM
%w 曜日(0=Sunday..6=Saturday)
%U 日曜日を週の最初の日とした場合の週(00..53)
%u 月曜日を週の最初の日とした場合の週(00..53)
%V 日曜日を週の最初の日とした場合の週(01..53)%X と組み合わせて使用
%v 月曜日を週の最初の日とした場合の週(01..53)%x と組み合わせて使用
%% リテラルの ‘%’
————————————————————————————————–

TIME_FORMAT()

DATE_FORMAT()関数と同じ動作をしますが、この関数は、フォーマット文字列formatに時、分、秒を
処理する形式指定子しか指定できません。 それ以外の指定子を指定した場合は、NULLまたは0が
返されます。


mysql> SELECT TIME_FORMAT(NOW(), '%H:%i:%s');
+--------------------------------+
| TIME_FORMAT(NOW(), '%H:%i:%s') |
+--------------------------------+
| 04:58:56 |
+--------------------------------+
1 row in set (0.00 sec)

mysql>

time_format


6.3.4. 日付と時刻関数


時間関数: 4.1の新しい機能