2014-08-29 58 views
2

我有一個varchar列的表稱爲birthdayMySQL的STR_TO_DATE不工作

CREATE TABLE IF NOT EXISTS `test` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `birthday` varchar(30) COLLATE utf16_unicode_ci NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf16 COLLATE=utf16_unicode_ci AUTO_INCREMENT=5 ; 

INSERT INTO `test` (`id`, `birthday`) 
VALUES (1, '20041225'), 
     (2, '2004-12-25'), 
     (3, '19941225'), 
     (4, '19941201'); 

我嘗試運行此查詢:

SELECT str_to_date(birthday,"%Y%m%d") 
FROM `test` 
WHERE 1 

但它總是空值返回行。

如果我運行查詢:

SELECT str_to_date('20141225',"%Y%m%d") 
FROM `test` 
WHERE 1 

它將返回2014-12-25

那麼,什麼毛病我查詢?

回答

4

將其保留爲simpler function s。 DATE()返回一個字符串的YYYY-MM-DD格式的日期部分:

SELECT DATE(birthday) FROM `test` 

結果:

2004-12-25  
2004-12-25  
1994-12-25  
1994-12-01  

你的代碼是不工作的原因是STR_TO_DATE()預計相同的輸入和輸出格式,例如STR_TO_DATE('2014-08-29', '%Y-%m-%d')。看看examples in the documentation。此功能主要用於將日期或時間從一種格式轉換爲另一種格式,其中原始格式是MySQL外部的內容,並且您希望將數據導入到MySQL的日期格式中 - 例如,在這種情況下,您會知道原始內容日期格式是。

例子:

SELECT STR_TO_DATE('20041225', '%Y-%m-$d'); -- null - formats don't match 
SELECT STR_TO_DATE('2004-12-25', '%Y-%m-%d'); -- 2004-12-25 - formats match 
+0

這對我有效。謝謝 – 2014-09-03 01:39:43

2

你必須與你表的創建COLLATE問題。如果你使用utf8_unicode_ci,那麼沒有任何問題。在sqlfiddle上查看此示例。更多關於排序規則,你可以閱讀這個Post

+0

+1,但對於與格式不匹配的值(例如第2行中的YYYY-MM-DD),它仍然會返回null。如果你沒有指定COLLATE,它也可以正常工作。 – 2014-08-29 03:41:41

+0

@scrowler你說得對'如果你沒有指定COLLATE',那麼它將採用默認的utf8_unicode_ci,這就是它的工作原理。 – Sadikhasan 2014-08-29 03:48:31

+0

對於這個問題,它仍然不是正確的解決方案,因爲輸入數據格式的不一致意味着它是錯誤的選擇功能。 – 2014-08-29 03:58:06