【问题标题】:MySQL: DATE_SUB/DATE_ADD that accounts for DST?MySQL:占 DST 的 DATE_SUB/DATE_ADD?
【发布时间】:2011-08-10 13:13:18
【问题描述】:

这会返回1(又名TRUE

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

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

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

【问题讨论】:

  • 这可能会有所帮助stackoverflow.com/questions/1646171/…(在 mysql 中不太可能有治愈方法)
  • 男孩!做I wish I could write a custom data type 正常工作!
  • 您必须编写自己的 DATE_SUB 函数,将 DST 考虑在内。顺便说一句,我很想扼杀那些梦想着 DST 噩梦的人。
  • 不能等待 64 位 unix 时间戳成为常态。 y293billionK 不会成为问题...

标签: mysql dst dateadd


【解决方案1】:

您需要创建一个自定义函数,类似这样。

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 ;

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    【解决方案3】:

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

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

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

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

    【讨论】:

    • 限制为 2038 会增加一些复杂性。例如,在日历上重复事件。显然 2038 不是一个真正的问题,但我喜欢以正确的方式做事,如果有正确的方式。关于第 4 段,我们已经在 MySQL 上,我认为没有太多理由做出如此重大的转变。
    猜你喜欢
    • 2016-09-15
    • 1970-01-01
    • 1970-01-01
    • 2019-09-15
    • 2011-10-14
    • 2013-03-16
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    相关资源
    最近更新 更多