1

すべての日付と時刻がローカル タイムゾーン (英国) で保存される従来のアプリケーションを継承しました。これらの保管方法を変更する立場にはありません。

ただし、要件は、アプリ内ですべての日付を GMT で表示することです。したがって、データベースからイベントのリストを取得するときは、特定のイベントの日付ごとに夏時間が稼働しているかどうかを観察しながら、すべてをこの時間形式で表示する必要があります。次のロジックを使用して、クエリ内で夏時間が有効かどうかを判断できます。

IF(CAST(TIMEDIFF(NOW(), UTC_TIMESTAMP()) AS SIGNED) >0, 
 DATE_FORMAT(CONVERT_TZ(ADDTIME(`event_date`, IFNULL(`event_time`, '00:00')), '+01:00', '+00:00'), '%H:%i'), `event_time`) AS event_time

ただし、これは明らかに、実行されている日付のみをチェックしています。そのため、夏時間の境界を超える将来のイベントは機能しません。

特定の日付が mysql クエリ自体の DST にあるかどうかを検出する方法はありますか?

どんな助けでも大歓迎です。

4

4 に答える 4

1

タイムゾーンはDATETIME値に保存されません。興味深いことに、それらはタイムスタンプ用です。

保存された日付が与えられると、ローカルルールに基づいて、その時点でDSTが「オン」であったかどうかを死後に把握できます。日付を変更できないため、タイムゾーンを格納する列を追加することはできないと思います...

ルールを含み、指定された日付をGMTに変換するストアドプロシージャを作成します。

グリニッジ周辺に住む人々だけがGMTで時刻を表示したいことに注意してください。:)

幸運を。

于 2012-09-11T18:24:16.453 に答える
1

あなたはイギリスにいます。したがって、TZ は CET または CEST (中央ヨーロッパ夏時間) である必要があります。次の方法で情報を取得できます。

mysql> SELECT @@system_time_zone;
+--------------------+
| @@system_time_zone |
+--------------------+
| CEST               |
+--------------------+

多くのストアド プロシージャでこれを使用しています。注: DST が適用されているかどうかに関係なく、オフセットを計算する必要があるかどうかに関係なく、両方の形式の TZ 情報が必要です。

CASE @@system_time_zone
  WHEN 'CET'  THEN SET l_tz = 'Europe/Paris';   SET l_tzOff = '+1:00';
  WHEN 'CEST' THEN SET l_tz = 'Europe/Paris';   SET l_tzOff = '+1:00';
  WHEN 'SGT'  THEN SET l_tz = 'Asia/Singapore'; SET l_tzOff = '+8:00';
  ELSE             SET l_tz = 'Europe/Paris';   SET l_tzOff = '+1:00';
END CASE;

ここからインスピレーションを得ることができます。

于 2015-04-08T15:27:53.130 に答える
-1

醜い複雑な方法を見つけました。@DT は入力 Date&Time です

Set @DT=20150329020304; # -> 0

Set @DT=20150329030304; # -> 1(-0.0511)

Set @DT=20150329040304; # -> 1(-1)

Select 0!=(UNIX_TIMESTAMP(@DT)-   UNIX_TIMESTAMP(Concat(Year(@DT),'0101',Time_Format(@DT,'%H%i%s')))-DateDiff(@DT,Concat(Year(@DT),'0101',Time_Format(@DT,'%H%i%s')))*86400)/3600 as DlsIsOn
于 2015-09-03T12:10:31.043 に答える