MySQL:占用DST的DATE_SUB / DATE_ADD?

时间:2011-04-21 18:59:59

标签: mysql dst dateadd

这会返回1(又名TRUE

SELECT DATE_SUB(NOW(), INTERVAL 24*100 HOUR) = DATE_SUB(NOW(), INTERVAL 100 DAY);

100天前,一天中的小时不会改变。但是由于夏令时(美国),100个二十四小时前的时间实际上比你按天数计算提前一小时。如果上述陈述占DST,则会返回0FALSE

对于给定的陈述或会话,我是否有办法说明DST?我宁愿不使用UNIX_TIMESTAMP因为它会在2038年之后切断任何东西。

3 个答案:

答案 0 :(得分:4)

你需要创建一个自定义函数,就像这样。

DELIMITER $$

CREATE FUNCTION DST(ADatetime DATETIME) RETURNS DATETIME
BEGIN
  DECLARE result DATETIME;
  SET Result = ADatetime;
  IF ADatetime >= startDST AND ADateTime <= endDST THEN 
    result = DATE_SUB(ADatetime, INTERVAL 1 HOUR);
  END IF;
  RETURN result;
END $$

DELIMITER ;

答案 1 :(得分:4)

这只是转换为UTC并返回的问题:

 CONVERT_TZ(DATE_SUB(CONVERT_TZ(NOW(),@@session.time_zone,'UTC'), INTERVAL 24*100 HOUR),'UTC',@@session.time_zone);

这假设您设置了时区表以使用命名时区。如果没有,您可以使用&#39; +0:00&#39;而不是&#39; UTC&#39;

答案 2 :(得分:-2)

如果可以确定64位整数时间戳至少在那之前20年到位,那么在2038年之后切断任何东西将是一个真正的问题吗?

说真的,MySQL中的日期时间/时间戳类型存在很多问题,您应尽量避免使用它们。

您是否存储了2038年以后的许多日期?

而且,为什么不尝试使用具有更高级类型支持的PostgreSQL呢?