MySQL
日付と時刻の操作
サーチ…
今()
Select Now();
現在のサーバーの日付と時刻を表示します。
Update `footable` set mydatefield = Now();
これにより、フィールドmydatefield
が、サーバーの設定されたタイムゾーンで現在のサーバーの日付と時刻に更新されます。
'2016-07-21 12:00:00'
日付演算
NOW() + INTERVAL 1 DAY -- This time tomorrow
CURDATE() - INTERVAL 4 DAY -- Midnight 4 mornings ago
3〜10時間前に質問されたmysql質問を表示する(180〜600分前):
SELECT qId,askDate,minuteDiff
FROM
( SELECT qId,askDate,
TIMESTAMPDIFF(MINUTE,askDate,now()) as minuteDiff
FROM questions_mysql
) xDerived
WHERE minuteDiff BETWEEN 180 AND 600
ORDER BY qId DESC
LIMIT 50;
+----------+---------------------+------------+
| qId | askDate | minuteDiff |
+----------+---------------------+------------+
| 38546828 | 2016-07-23 22:06:50 | 182 |
| 38546733 | 2016-07-23 21:53:26 | 195 |
| 38546707 | 2016-07-23 21:48:46 | 200 |
| 38546687 | 2016-07-23 21:45:26 | 203 |
| ... | | |
+----------+---------------------+------------+
TIMESTAMPDIFF()
MySQLマニュアルページ。
注意 MySQLの日付演算にはCURDATE() + 1
ような式を使用しないでください。特に、Oracleデータベース製品に慣れている場合は、期待通りの結果を返しません。代わりにCURDATE() + INTERVAL 1 DAY
使用してください。
日付範囲に対するテスト
BETWEEN
... AND
...を日付範囲に使用することは非常に魅力的ですが、問題があります。代わりに、このパターンはほとんどの問題を回避します。
WHERE x >= '2016-02-25'
AND x < '2016-02-25' + INTERVAL 5 DAY
利点:
-
BETWEEN
は「包括的」BETWEEN
、最終日または秒を含みます。 -
23:59:59
は、DATETIME
マイクロ秒の解像度を持っていれば、不器用で間違っています。 - このパターンは、閏年やその他のデータ計算を避けるためのものです。
-
x
がDATE
、DATETIME
、TIMESTAMP
いずれであっても動作しTIMESTAMP
。
SYSDATE()、NOW()、CURDATE()
SELECT SYSDATE();
この関数は、文字列または数値のどちらのコンテキストで使用されるかに応じて、現在の日付と時刻を'YYYY-MM-DD HH:MM:SS'
またはYYYYMMDDHHMMSS
形式で値として返します。現在のタイムゾーンで日付と時刻を返します。
SELECT NOW();
この関数はSYSDATE()
同義語です。
SELECT CURDATE();
この関数は、文字列または数値のどちらのコンテキストで使用されるかに応じて、現在の日付を時間なしで、 'YYYY-MM-DD'
またはYYYYMMDD
形式の値として返します。現在のタイムゾーンの日付を返します。
指定された日付または日付時刻の式から日付を抽出する
SELECT DATE('2003-12-31 01:02:03');
出力は次のようになります。
2003-12-31
日付と時間の検索のための索引の使用
多くの実世界のデータベース表には、 DATETIME
またはTIMESTAMP
列の値が長年または数十年を含む多くの時間にわたる多くの行がありTIMESTAMP
。 WHERE
句を使用してそのタイムパンの一部を取得する必要があることがよくあります。たとえば、テーブルから2016年9月1日の日付の行を取得することができます。
これを行う非効率的な方法はこれです:
WHERE DATE(x) = '2016-09-01' /* slow! */
これは、列の値にDATE()
関数を適用するため、非効率的です。つまり、MySQLはx
各値を調べなければならず、インデックスは使用できません。
操作を行うためのより良い方法は、これです
WHERE x >= '2016-09-01'
AND x < '2016-09-01' + INTERVAL 1 DAY
これは、の値の範囲を選択しx
まで、問題の日にどこかに横たわるが、(それゆえ含めない <
翌日)真夜中を。
テーブルにx
カラムのインデックスがある場合、データベースサーバはインデックスに対してレンジスキャンを実行できます。つまり、xの最初の関連する値をすばやく見つけて、最後に関連する値が見つかるまで順番にインデックスをスキャンすることができます。インデックス範囲のスキャンは、 DATE(x) = '2016-09-01
必要な全表スキャンよりもはるかに効率的DATE(x) = '2016-09-01
。
より効率的に見えても、これを使用するように誘惑されないでください。
WHERE x BETWEEN '2016-09-01' AND '2016-09-01' + INTERVAL 1 DAY /* wrong! */
これはレンジスキャンと同じ効率がありますが、2016年9月2日の真夜中にx
値を持つ行を選択します。これはあなたが望むものではありません。