0

日付が夏時間であるかどうかを判断しようとしています。これは、費用に影響するため、2 つの日付間の時間数を決定するために使用されます。可能な限りコードを削除しようとしました。私は構文に少し苦労しています (is_daylight 関数は存在しません) が、うまくいけば、何をしようとしているのかを伝えることができました。どんな助けでも大歓迎です。

SELECT 

  -- lost an hour on pickup date so add an hour to the date
  WHEN 
   is_daylight(pickup_date)=1 AND is_daylight(dropoff_date)=0
  THEN 
    unix_timestamp(dropoff_date) - unix_timestamp(pickup_date)+3600 / 86400 as num_hours

  -- not date time
  ELSE
    unix_timestamp(dropoff_date) - unix_timestamp(pickup_date) / 86400 as num_hours 
4

1 に答える 1

2

マニュアルには次のように記載されています。

UNIX_TIMESTAMP()その引数が現在のタイムゾーンの日時値であると想定します。

したがって、サーバーが適切に構成されている場合、つまり正しいタイムゾーンを使用している場合、UNIXタイムスタンプには、必要になる可能性のあるdstの変更がすでに組み込まれている必要があります。したがって、まず、修正するものがあることを確認し、修正する場合は、タイムゾーンサポートが適切に構成されているかどうかを確認します。

スイッチオーバーの直後に、スイッチオーバーの前と後の2つのUTC時間に対応する現地時間が存在する可能性があるため、変換は不可逆であることに注意してください。このため、UNIXタイムスタンプを常に保存し、ユーザー出力用に現地時間にのみ変換する方がよい場合があります。

DSTが特定の日付でアクティブであるかどうかを知りたい場合は、おそらくを使用できますCONVERT_TZ。現地時間から、DSTなしの現地時間に対応する固定オフセット時間に変換します。結果が同じままの場合、DSTはアクティブではありません。1時間変化すると、DSTがアクティブになります。

例:

SELECT CASE
 WHEN            '2013-07-24 15:00' =
      CONVERT_TZ('2013-07-24 15:00', 'EST', 'America/New_York')
 THEN 'no DST' ELSE 'DST' END AS isDST
于 2012-12-14T14:19:46.207 に答える