2013-07-24 54 views
1

我正在處理的數據位於我之前的開發人員已經懶惰且未以設定格式存儲日期。它作爲varchar而不是日期時間。不用說,它的左邊我需要排序數據。Mysql - 存儲多個不正確的日期格式

它有兩種格式

1) {dd}/{mm}/{yyyy} {hh}:{mm} 
2) {dd}.{mm}.{yyyy} {hh}:{mm} 

我想確保它在mysql日期格式總是返回。下面的查詢將得到第一個。

SELECT 
    str_to_date(a.rentalstart, '%d/%m/%Y %k:%i'), 
    a.* 
FROM 
    jupiter1.table a 
ORDER by createtime DESC 

我該如何將兩者結合?如果它匹配,我也需要它默認爲一個普通的mysql日期時間。

{yyyy}-{mm}-{dd} {hh}:{mm}:{ss}

回答

2
SELECT CASE WHEN a.rentalstart LIKE "%/%/% %:%" 
      THEN str_to_date(a.rentalstart, '%d/%m/%Y %k:%i') 
      WHEN a.rentalstart LIKE "%.%.% %:%" 
      THEN str_to_date(a.rentalstart, '%d.%m.%Y %k:%i') 
      ELSE CAST(a.rentalstart AS DATETIME) 
     END AS rentalstart_good, 
     a.* 
FROM ... 
+0

謝謝你這個工作的答案。我特別喜歡使用CAST –

+0

@Robbo_UK:實際上,'CAST()'是確保結果集中的'rentalstart_good'列是臨時數據類型所必需的 - 否則它將是一個字符串。 – eggyal

0
SELECT 
    str_to_date(replace(replace(a.rentalstart, '.', '-'), '/', '-'), if(a.rentalstart like '%-%-%-%', '%Y-%m-%d %k:%i', '%d-%m-%Y %k:%i')), 
    a.* 
FROM 
    jupiter1.table a 
ORDER by createtime DESC 

這是否解決問題了嗎?
編輯包括您的默認條件也

1

你可以簡單做REPLACE。它將以{dd}.{mm}.{yyyy} {hh}:{mm}格式轉換所有記錄並將其轉換爲DateTime數據類型。

SELECT STR_TO_DATE(REPLACE(a.rentalstart, '/', '.'), '%d.%m.%Y %k:%i') newDate, 
     a.* 
FROM jupiter1.table a 
ORDER BY newDate DESC 
+1

「*我也需要它默認爲正常的MySQL的日期時間,如果它匹配'{YYYY} - {毫米} - {DD} {HH} {毫米} {SS}'* 「 – eggyal