MySQL:DATE_SUB/DATE_添加哪个帐户用于DST?
这将返回MySQL:DATE_SUB/DATE_添加哪个帐户用于DST?,mysql,dst,dateadd,Mysql,Dst,Dateadd,这将返回1(也称为TRUE) 100天前,一天中的时间不变。但由于夏令时(美国),24小时前的100个时段实际上比按天计算的时间早一个小时。如果上述语句考虑了DST,它将返回0或FALSE 有没有一种方法可以解释给定语句或会话的DST?我不想使用UNIX\u TIMESTAMP,因为它会切断超过2038年的任何数据。您需要创建一个自定义函数,类似这样的函数 DELIMITER $$ CREATE FUNCTION DST(ADatetime DATETIME) RETURNS DATETIME
1
(也称为TRUE
)
100天前,一天中的时间不变。但由于夏令时(美国),24小时前的100个时段实际上比按天计算的时间早一个小时。如果上述语句考虑了DST,它将返回0
或FALSE
有没有一种方法可以解释给定语句或会话的DST?我不想使用
UNIX\u TIMESTAMP
,因为它会切断超过2038年的任何数据。您需要创建一个自定义函数,类似这样的函数
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 ;
分隔符$$
创建函数DST(ADatetime DATETIME)返回DATETIME
开始
声明结果日期时间;
设置结果=ADatetime;
如果ADatetime>=startDST和ADatetime如果您可以确保至少在2038年之前的20年内,64位整数时间戳将在任何地方都被执行,那么在2038年之后,如何切断任何东西将是一个真正的问题
说真的,MySQL中的datetime/timestamp类型有很多问题,您应该尽可能避免它们
2038年以后你会储存很多日期吗
还有,为什么不尝试使用具有更高级类型支持的PostgreSQL?这实际上只是转换为UTC并返回的问题:
CONVERT_TZ(DATE_SUB(CONVERT_TZ(NOW(),@@session.time_zone,'UTC'), INTERVAL 24*100 HOUR),'UTC',@@session.time_zone);
这假设您已将时区表设置为使用命名时区。如果没有,您可以使用“+0:00”而不是“UTC”这可能会有帮助(在mysql中不太可能有治愈方法)男孩!请确保它正常工作!您必须编写自己的DATE_子函数,将DST考虑在内。顺便说一句,我很想扼杀任何梦见DST噩梦的人。迫不及待64位unix时间戳变成正常。Y2930亿不会是个问题……限制到2038年会增加一点复杂性。例如,在日历上重复事件。显然2038年不是一个真正的问题,但我喜欢用正确的方式做事,如果有正确的方式的话。关于第4段,我们已经在MySQL上了,我认为没有太多理由做出如此重大的改变。请注意这个答案,因为convert_tz不适用于早于纪元(包括纪元)以及2038年以后的日期:
CONVERT_TZ(DATE_SUB(CONVERT_TZ(NOW(),@@session.time_zone,'UTC'), INTERVAL 24*100 HOUR),'UTC',@@session.time_zone);