9

这返回1(又名TRUE

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

100 天前,一天中的小时没有改变。但由于夏令时(美国),100 个 24 小时前的时间段实际上比按天数计算的时间早一小时。如果上面的语句考虑了夏令时,它会返回0or FALSE

有没有一种方法可以说明给定语句或会话的 DST?我宁愿不使用UNIX_TIMESTAMP,因为它会切断 2038 年以后的任何东西。

4

3 回答 3

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 ;
于 2011-09-07T15:17:00.997 回答
4

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

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

这假设您已将时区表设置为使用命名时区。如果没有,您可以使用 '+0:00' 而不是 'UTC'

于 2017-02-27T06:03:49.647 回答
-2

当您可以确定至少在 20 年前将在任何地方实施 64 位整数时间戳时,切断 2038 年之后的任何事情会是一个真正的问题吗?

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

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

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

于 2011-09-23T11:30:10.630 回答