MySQL毫秒數(shù)不一致為什么日期時間一致
在做項目的過程中,一個小的忽視或粗心可能會導致一個大的問題,甚至浪費過多的時間。我曾經(jīng)遇到一個問題:含有年月日時分秒的日期在數(shù)據(jù)庫以毫秒數(shù)存儲,但將不同的毫秒數(shù)轉(zhuǎn)換成日期時,卻發(fā)現(xiàn)它們竟然是同一個日期
在做項目的過程中,一個小的忽視或粗心可能會導致一個大的問題,甚至浪費過多的時間。我曾經(jīng)遇到一個問題:含有年月日時分秒的日期在數(shù)據(jù)庫以毫秒數(shù)存儲,但將不同的毫秒數(shù)轉(zhuǎn)換成日期時,卻發(fā)現(xiàn)它們竟然是同一個日期。這究竟是怎么回事呢?
日期時間格式大小寫的原因
經(jīng)過反復查看SQL語句,我發(fā)現(xiàn)問題出在日期時間格式的大小寫上。下面通過一個實例來具體說明:
第一步:將一個日期時間轉(zhuǎn)換成毫秒數(shù)
首先,我們將一個特定的日期時間轉(zhuǎn)換成毫秒數(shù)。例如,我們將"2015-05-09 14:30:56"轉(zhuǎn)換成毫秒數(shù),SQL語句如下:
```
select UNIX_TIMESTAMP('2015-05-09 14:30:56')*1000 as statis_date;
```
結(jié)果為:"1431153056000"
第二步:將另一個日期時間轉(zhuǎn)換成毫秒數(shù)
接著,我們將另外一個日期時間也轉(zhuǎn)換成毫秒數(shù)。例如,我們將"2015-05-09 02:30:56"轉(zhuǎn)換成毫秒數(shù),SQL語句如下:
```
select UNIX_TIMESTAMP('2015-05-09 02:30:56')*1000 as statis_date;
```
結(jié)果為:"1431109856000"
第三步:將毫秒數(shù)轉(zhuǎn)換成日期時間
然后,我們將第一步中的毫秒數(shù)轉(zhuǎn)換回日期時間。例如,我們使用以下SQL語句將毫秒數(shù)"1431153056000"轉(zhuǎn)換成日期時間:
```
select FROM_UNIXTIME(1431153056000/1000, '%Y-%m-%d %h:%i:%s') as statis_time;
```
結(jié)果為:"2015-05-09 02:30:56"
第四步:將毫秒數(shù)轉(zhuǎn)換成日期時間
同樣地,我們將第二步中的毫秒數(shù)也轉(zhuǎn)換回日期時間。例如,我們使用以下SQL語句將毫秒數(shù)"1431109856000"轉(zhuǎn)換成日期時間:
```
select FROM_UNIXTIME(1431109856000/1000, '%Y-%m-%d %h:%i:%s') as statis_time;
```
結(jié)果為:"2015-05-09 02:30:56"
日期大小寫問題導致的結(jié)果一致
在第一步和第二步中,我們明明是用兩個不同的日期時間轉(zhuǎn)換成毫秒數(shù),并且毫秒數(shù)也是不一致的,但是在第三步和第四步中,將毫秒數(shù)轉(zhuǎn)換成日期時卻得到了相同的結(jié)果。這是為什么呢?
經(jīng)過查詢資料和詢問別人,我發(fā)現(xiàn)在日期和毫秒數(shù)轉(zhuǎn)換時,需要注意大小寫的問題。對應(yīng)的格式字符串中的字母大小寫是有含義的,如下:
- "Y"表示年份,大寫代表四位數(shù)字,小寫代表兩位數(shù)字
- "m"表示月份,大寫和小寫都表示兩位數(shù)字
- "d"表示日期,大寫和小寫都表示兩位數(shù)字
- "H"表示小時(24小時制),大寫和小寫都表示兩位數(shù)字
- "h"表示小時(12小時制),大寫和小寫都表示兩位數(shù)字
- "i"表示分鐘,大寫和小寫都表示兩位數(shù)字
- "s"表示秒鐘,大寫和小寫都表示兩位數(shù)字
因此,使用不同大小寫的格式字符串可能會導致不同的結(jié)果。
例如,我們將第三步中的SQL語句中的"%h"改為"%H":
```
select FROM_UNIXTIME(1431153056000/1000, '%Y-%m-%d %H:%i:%s') as statis_time;
```
結(jié)果為:"2015-05-09 14:30:56"
可以看到,與第四步的結(jié)果不一樣了。
結(jié)論
在日期轉(zhuǎn)換過程中,務(wù)必注意格式字符串中的大小寫,確保滿足正確的日期格式。否則,在轉(zhuǎn)換時可能會得到意外的結(jié)果。