Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL:DATE_SUB/DATE_添加哪个帐户用于DST?_Mysql_Dst_Dateadd - Fatal编程技术网

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);