2011-04-21 52 views
9

這將返回1(又名TRUEMySQL:DATE_SUB/DATE_ADD佔DST?

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

100天,一天的時間不會改變。但由於夏令時(美國)的原因,二十四小時前的實際時間比按天計算的實際時間早一小時。如果上述說明佔DST,則將返回0FALSE

有沒有一種方法可以解釋給定的語句或會話的DST?我寧願不使用UNIX_TIMESTAMP,因爲它切斷了2038年前的任何事情。

+1

這可能會有幫助http://stackoverflow.com/questions/1646171/mysql-datetime-fields-and-daylight-savings-time-how -do-i-reference-the-extra(不太可能在mysql中有治療) – ajreal 2011-09-07 13:24:10

+0

男孩!做[我希望我可以寫一個自定義的數據類型](http://dba.stackexchange.com/questions/5098/is-there-such-thing-as-custom-data-types),正常工作! – 2011-09-07 14:19:03

+0

您必須爲您編寫自己的DATE_SUB功能,並考慮到DST。順便說一句,我很想扼殺那些夢見DST噩夢的人。 – Johan 2011-09-07 15:12:58

回答

-2

將如何切斷任何過去2038是當你可以肯定的是64位整數時間戳將無處不在此之前,至少20年來immplemented一個真正的問題?

嚴重的是,在MySQL中有很多datetime/timestamp類型的問題,您應該儘可能避免使用它們。

你存儲了2038年以後的許多日期嗎?

而且,爲什麼不嘗試使用具有更高級類型支持的PostgreSQL呢?

+0

限制到2038增加了一點複雜性。例如,在日曆上重複事件。顯然2038年並不是一個真正的問題,但如果有一個正確的方法,我喜歡以正確的方式做事。關於第四段,我們已經在使用MySQL,我認爲沒有太多理由要做這樣的重大轉變。 – 2011-09-23 18:36:16

+0

Meta:http://meta.stackoverflow.com/questions/284044/is-this-really-an-answer – cybermonkey 2015-01-19 21:44:54

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

這僅僅是一個轉換爲UTC和後面的事情:

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

這裏假設你有設置爲使用命名的時區的時區表。如果沒有,你可以使用'+0:00'而不是'UTC'