2015-03-25 142 views
0

如果我有一個DATETIME列的表,我可以插入具有類似格式的日期:MySQL和日期時間

2015-03-25 10:10:10 
2015-03-25 10:10 
2015-03-25 10 
2015-03-25 

它將在與零餘繼續進行。我不能使用

2015-03 
2015 

因爲它會給'不正確的日期時間值'錯誤。然而,有可能在SELECT中使用這最後兩個,如[..] WHERE timestamp < '2015-03' ..

如果在datetimes中省略或者我有沒有辦法讓MySQL在月份和日期中填充01-01的其餘日期時間自己手動做到這一點?

I.e.我想在INSERT語句中使用 '2015-03',或做類似SELECT DATE_FORMAT('2015-03', '%Y%m%dT%H%i%S')

回答

0

嘗試UNIX_TIMESTAMP()

SELECT like [..] WHERE unix_timestamp(timestamp) < '2015-03' 
1

正如Date and Time Literals說:

MySQL的認識DATE值在這些格式中:

  • 作爲'YYYY-MM-DD''YY-MM-DD'格式。允許使用「寬鬆」的語法:任何標點字符都可以用作日期部分之間的分隔符。例如,'2012-12-31''2012/12/31','2012^12^31''[email protected]@31'是等同的。

  • 作爲一個字符串,無論是'YYYYMMDD'還是'YYMMDD'格式都沒有分隔符,前提是字符串作爲日期有意義。例如,'20070523''070523'被解釋爲'2007-05-23',但'071332'是非法的(它具有無意義的月份和日期部分)並且變爲'0000-00-00'

  • 作爲YYYYMMDDYYMMDD格式中的數字,前提是該數字在日期中有意義。例如,19830905830905被解釋爲'1983-09-05'

的MySQL識別這些格式DATETIMETIMESTAMP值:

  • 如在任一'YYYY-MM-DD HH:MM:SS''YY-MM-DD HH:MM:SS'格式的字符串。這裏也允許使用「寬鬆」的語法:任何標點字符都可以用作日期部分或時間部分之間的分隔符。例如,'2012-12-31 11:30:45','2012^12^31 11+30+45','2012/12/31 11*30*45''[email protected]@31 11^30^45'是等同的。

    日期和時間部分和小數部分之間唯一識別的分隔符是小數點。

    日期和時間部分可以用T而不是空格分開。例如,'2012-12-31 11:30:45''2012-12-31T11:30:45'是等效的。

  • 作爲一個沒有分隔符的字符串,其格式爲'YYYYMMDDHHMMSS''YYMMDDHHMMSS',前提是該字符串作爲日期有意義。例如,'20070523091528''070523091528'被解釋爲'2007-05-23 09:15:28',但'071122129015'是非法的(它具有無意義的微小部分)並且變爲'0000-00-00 00:00:00'

  • 作爲YYYYMMDDHHMMSSYYMMDDHHMMSS格式的數字,前提是該數字作爲日期有意義。例如,19830905132800830905132800被解釋爲'1983-09-05 13:28:00'

值得注意的是,MySQL的不支持您希望使用不完整格式。

,MySQL的發生接受一些你已經嘗試了不完整的格式(顯然是用零填充)是無證行爲,很可能由開發商意想不到的。它不能不可能(和不應該),尤其是因爲邊緣情況下可能存在行爲破壞;或者因爲行爲在未來版本中可能會更改而不會發出警告。

如果是絕對必要提供這種不完整的時間文字到MySQL(它不應該,因爲你的數據訪問層應當知道價值觀是處理的類型,並將它們在提供到MySQL支持的格式),你可以使用它的STR_TO_DATE()功能相應地解析他們:

未指定的日期或時間部分有一個0值,在STR產生的部分或全部零件的結果使不完全指定的值設爲0:

mysql> SELECT STR_TO_DATE('abc','abc'); 
     -> '0000-00-00' 
mysql> SELECT STR_TO_DATE('9','%m'); 
     -> '0000-09-00' 
mysql> SELECT STR_TO_DATE('9','%s'); 
     -> '00:00:09'

對日期值部分的範圍檢查如Section 11.3.1, 「The DATE, DATETIME, and TIMESTAMP Types」中所述。這意味着,例如,除非SQL模式被設置爲禁止這些值,否則允許「零」日期或部分值爲0的日期。

因此,舉例來說,你可以使用:

STR_TO_DATE('2015-03', '%Y-%m'); 
+0

附錄:那不完整格式「支持」,在這個問題給出了'WHERE'條款的例子是,因爲這些文字被解析的原因作爲單純的字符串;並且根據數據庫連接的核對按字典順序執行比較。雖然它不是時間類型的真正比較(並且由於時間列上的索引不能被使用而不是可靠的),但它發生(由於MySQL的日期時間格式的佈局),這樣的字典順序產生與真正的時間類型相同的結果。 – eggyal 2015-03-25 11:36:54

+0

謝謝。我期望'使用'這些時間戳的唯一原因是因爲MySQL首先不會錯(全部)它們。我希望不必編寫能夠將「2015-03」這樣的正確的ISO8601轉換爲MySQL DATETIME格式但可惜的東西。 – Lieuwe 2015-03-25 11:46:37

+0

@Lieuwe:這樣做的代碼通常已經存在於數據訪問層 - 所以除非你自己寫(不建議考慮到已經提供了這種功能的大量優秀的庫),你真的不應該擺脫這種低級的實施細節。 – eggyal 2015-03-25 12:19:01