2014-09-01 59 views
1

我有一個包含不同類型數據的表。其中的一個是生日日期:MySql中的時間戳和夏令時[dst]

ID | meta_key | meta_value 
========================== 
1 | birthday | 2011-30-01 
2 | birthday | 2011-30-07 
3 | other | not_related 

利用已知的時間戳我想獲得的所有生日像

SELECT * 
FROM table 
WHERE meta_value = 'birthday' 
    AND UNIX_TIMESTAMP(STR_TO_DATE(meta_value,'%Y-%m-%d')) = 1296342000 

應返回的第一行(#1),但沒有。原因是時間戳必須是1296345600

我做了一個sqlfiddle來仔細檢查。

看起來DST是造成這個問題,但爲什麼?這些基於UNIX時間戳的時間戳不是全部UTC嗎?我會得到我的PHP的strtotime()時間戳像

strtotime('2011-30-01') 

編輯:

我不能比較字符串直接,因爲我也喜歡得到一定的「範圍」的結果,如「八月至所有生日十月」

+1

爲什麼你首先使用unix時間戳?爲什麼不直接比較字符串日期? – 2014-09-01 16:10:48

+0

不可能的原因我喜歡使用> =,>,<,<=以及 – Xaver 2014-09-01 16:12:59

+1

'我無法直接比較字符串,因爲我也喜歡從「從8月到10月的所有生日」這樣的某個「範圍」 '你可以做到這一點比較日期...而不是unix timestamp – 2014-09-01 16:13:28

回答

2

不知道爲什麼你需要將其轉換爲unix時間戳..第一件事Unix時間戳轉換成UTC時間SEE DOCS

,但好像你正在嘗試的事情比你更應該複雜化...你可以做在MySQL這樣

SELECT * 
FROM meta 
WHERE STR_TO_DATE(meta_value,'%Y-%m-%d') >= '2011-04-01'; 

直日期比較,你也可以做多重比較

SELECT * 
FROM meta 
WHERE STR_TO_DATE(meta_value,'%Y-%m-%d') >= '2011-08-01' 
    AND STR_TO_DATE(meta_value,'%Y-%m-%d') <= '2011-10-31'; 

或者你可以用BETWEEN

SELECT * 
FROM meta 
WHERE STR_TO_DATE(meta_value,'%Y-%m-%d') BETWEEN '2011-08-01' AND '2011-10-31'; 

就像建議..我建議你更新表格,並將meta_value更改爲實際日期而不是長文本...它是一個很好的經驗法則來存儲日期作爲其預期的數據類型.. :)

+0

好吧,這個作品完美無缺,乾杯! – Xaver 2014-09-01 16:24:26

+0

@revaxarts不客氣! :)祝你好運 – 2014-09-01 16:24:58

+0

其實,我不相信str_to_date函數在這裏實際上是必需的。用yyyy-mm-dd的日期格式,我想不出任何會給你錯誤答案的值,如果你只是使用meta_value的字符串值。 – 2014-09-01 16:27:24