web-dev-qa-db-ja.com

(MySQLで)DATETIME値をTIMESTAMP値と比較する方法は?

DATETIME値(表面上はGMTとして挿入)とTIMESTAMP値(INSERT時に自動的に生成される)を比較する方法を理解しようとしています。

私が理解しているように、DATETIMEは何に設定されていても設定されます。サーバーまたはクライアントのどのタイムゾーンに配置されていても、レポートには同じ値が返されます。

MySQLのドキュメントでは、TIMESTAMP値は現在のタイムゾーンで報告されているようですが、UTCで保存されています。

この場合、DATETIMEがGMTでTIMESTAMP値がUTCであるため、多くのタイムゾーン変換を行わなくても、TIMESTAMP値からDATETIME値(以前のイベント)を減算できるはずです。しかし、これを正確に行うこと、そしてそれを理解することは、問題であることが判明しています。

_(DATETIME - TIMESTAMP)_が必要な状況が数分と数日あります。列dがDATETIMEであり、列tがTIMESTAMPであると仮定すると...これまでのところ、私は試しました:

  • DATEDIFF(d,t)
  • TIMEDIFF(d,t)
  • UNIX_TIMESTAMP(d) - UNIX_TIMESTAMP(t) - 1800(DSTの説明)

ここのタイムゾーンは、米国中部時間-現在は中央夏時間-CSTの場合はGMT-6、現在のCDTの場合はGMT-5です。

また、DATEDIFFは両方の値を日付に変換してから比較しているように見えます。値間の時間を比較して、それぞれの24時間の数で除算するのではありません。したがって、とにかくDATEDIFFが直接機能することはないと思います。

具体的な質問は次のとおりです。

  • GMTのDATETIMEとTIMESTAMP値をどのように比較しますか?具体的には、TIMESTAMP値が最後に生成されたと仮定して、2つの間の分数を見つけます。
  • 同じ2つの値の間の24時間スロットの違いを取得する最良の方法は何ですか?私はそれがそうであると思います-上記の質問への答えとしてA1を使う-TRUNCATE(A1 / (24.0 * 60.0)) ...

PDATE: _CONVERT_TZ_およびGMTの値を指定して_US/Central_関数を使用してみました。ただし、そのような仕様を持つ_CONVERT_TZ_関数は、現在のシステム時刻からではなく、現在のシステム時刻から夏時間の設定を読み取るように表示されます。データベースフィールドから読み取ります。つまり、データをCSTで日付として取得する必要がある場合、代わりにCDTとして読み取られます。

TIMESTAMPフィールドのUTC表現を簡単に取得できるのはgotだと考え続けています。

PDATE 2: _CONVERT_TZ_について誤解しているようです。私はこの関数を使用していますが、うまくいくようです:

TIMEDIFF(CONVERT_TZ(t),'US/Central','UTC'),d)

タイムゾーンが変わっても(CSTからCDTに)、うまくいくようです...

3
Mei

時間と日付の関数には manual page があります。

日付と時刻を比較して分を取り戻す最善の方法は、おそらく次のいずれかを使用することです。

SELECT TIME_TO_SEC(TIMEDIFF(timea,timeb)+0)/60
SELECT TIMESTAMPDIFF(MINUTE,timeb,timea)

TIMEDIFFは時間とともに機能しますが、TIMESTAMPDIFFには日付コンポーネントが必要であり、値はTIMESTAMPDIFFで切り替えられます。

次のいずれかで時間を返すことができます。

SELECT TIME_TO_SEC(TIMEDIFF(timea,timeb)+0)/60/60
SELECT TIMESTAMPDIFF(HOUR,timeb,timea)

DATEDIFFを使用する場合、返される値は指定された時間の日付コンポーネント間の差であることに注意してください。つまり、ある日の23:59の値と次の日の0:01の値(a 2分の差)の場合、日付の差は1(終日)になります。

24時間の期間(1日の長さ)の2つの時間の差を取得するには、最初に分単位の差を計算し、次に適切な値で除算して24時間の期間の数を求めます。これを試して:

SELECT TRUNCATE(TIMESTAMPDIFF(MINUTE,timeb,timea)/60.0/24.0,0)

これにより、小数部分が切り捨てられ、指定された期間の完全な24時間の期間の数のみが返されます。

1
Mei