サーチ…


今()

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マイクロ秒の解像度を持っていれば、不器用で間違っています。
  • このパターンは、閏年やその他のデータ計算を避けるためのものです。
  • xDATEDATETIMETIMESTAMPいずれであっても動作し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列の値が長年または数十年を含む多くの時間にわたる多くの行がありTIMESTAMPWHERE句を使用してそのタイムパンの一部を取得する必要があることがよくあります。たとえば、テーブルから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値を持つ行を選択します。これはあなたが望むものではありません。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow