0

我想确定一个日期是否在夏令时。这用于确定两个日期之间的小时数,因为这将影响成本 - 它用于护理租赁。我试图尽可能地剥离代码。我在语法上有点挣扎(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 修改。所以首先,确保有什么要修复的,如果有,检查时区支持是否配置正确。

请注意,转换是有损的,因为在切换前后,本地时间可能对应于两个 UTC 时间,一个在切换之前,一个在切换之后。出于这个原因,最好始终存储 unix 时间戳,并且只转换为本地时间以供用户输出。

如果您想知道 DST 在给定日期是否有效,您可以使用CONVERT_TZ. 从本地时间转换为与没有 DST 的本地时间相对应的固定偏移时间。如果结果保持不变,则 DST 未激活。如果它改变一小时,则 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 回答