2016-07-25 19 views
0

Benötigen Sie Hilfe bei SQL-Abfrage empfehlen, wo ich eine Varchar-Spalte namens Zeit wie habe untermysql String to date Umwandlung

+---------------------+ 
| Timing   | MO | 
+---------------------+ 
|7/11/2016 20:45 |ABC | 
|7/12/2016 20:45 |ABC | 
|2016-07-11 00:00|ABC | 
|2016-07-12 00:00|ABC | 
+---------------------+ 

Ich brauche Datum aus der Timing-Spalte, aber schwierigem Teil zu extrahieren, ist das Datum, nicht immer in gleiches Format. Ich muß Ausgabezeit Spalte wie unten

+-------------+ 
| Timing | MO| 
+-------------+ 
|7/11/2016|ABC| 
|7/12/2016|ABC| 
|7/11/2016|ABC| 
|7/12/2016|ABC| 
+-------------+ 
+2

Warum fügen Sie Datum in 'Varchar' Feld und warum in verschiedenen Formaten? – itzmukeshy7

+0

Die Timing-Spalte wird von mehreren CSVs importiert. Ich habe keine Kontrolle darüber, wie die Zeit in diesen CSV –

+0

bevölkert ist Sie können es in einem gleichen konvertieren, während der Import ... richtig oder nicht? – itzmukeshy7

Antwort

0

Es ist einfach genug, um mit substring und Ersetzen-Funktionen varchar als Daten zu werfen und neu gefasst Sie diese Ausgabe erforderlich. zum Beispiel

DROP TABLE T; 
CREATE TABLE T (TIMING VARCHAR(20),MO VARCHAR(2)); 
INSERT INTO T VALUES 
('7/11/2016 20:45' ,'AB'), 
('7/12/2016 20:45' ,'AB'), 
('2016-07-11 00:00','AB'), 
('2016-07-12 00:00','AB'), 
('27/06/2016 20:45' ,'AB'), 
('29/05/2016 20:45' ,'AB') 
*/ 

SELECT *, 
      CASE 
       WHEN INSTR(TIMING,'/') = 0 THEN 
        CASE WHEN INSTR(TIMING,'-') = 5 THEN CAST(TIMING AS DATE) 
        end 
       WHEN INSTR(TIMING,'/') = 3 THEN 
        CAST(
        CONCAT(
        SUBSTRING(CONCAT('0',TIMING),8,4) 
        ,'-' 
        ,SUBSTRING(CONCAT('0',TIMING),5,2) 
        ,'-' 
        ,SUBSTRING(CONCAT('0',TIMING),1,2) 
        ) 
        AS DATE 
        ) 
       WHEN INSTR(TIMING,'/') = 2 THEN 
        CAST(
        CONCAT(
        SUBSTRING(CONCAT('0',TIMING),7,4) 
        ,'-' 
        ,SUBSTRING(CONCAT('0',TIMING),4,2) 
        ,'-' 
        ,SUBSTRING(CONCAT('0',TIMING),1,2) 
        ) 
        AS DATE 
        ) 
      END 
FROM  T 

Ergebnisse in

-----------------------------------------------------------------------------+ 
| 7/11/2016 20:45 | AB | 2016-11-07                                                              | 
| 7/12/2016 20:45 | AB | 2016-12-07                                                              | 
| 2016-07-11 00:00 | AB | 2016-07-11                                                              | 
| 2016-07-12 00:00 | AB | 2016-07-12                                                              | 
| 27/06/2016 20:45 | AB | 2016-06-02                                                              | 
| 29/05/2016 20:45 | AB | 2016-05-02                                                              | 
+------------------+------+----------------------------------------------------- 

Sie haben für jede bekannte Variante codieren - in diesem Fall habe ich festgestellt habe, dass 2016.07.11 mit Null aufgefüllt links muss und ersetzt Schrägstriche mit Bindestrichen vor der Datumsumwandlung. Hoffentlich haben Sie eine begrenzte Anzahl von Datumsvariationen in Ihrer Quelle, um zu codieren, und Sie werden mit einer großen Frage enden - aber das ist das Leben. Gott Glück,

+0

Es gibt nur zwei Variationen in den Datumsformaten "7/11/2016 20:45" & "2016-07-11 00:00". Ich denke deine Lösung ist sehr nah genug :). einzige Sache ist der Monat in Zeile 3. und 4., also 2016-07-11, 2016-07-12 muss so sein 2016-11-07 2016-12-07. können wir das auch tun? Bitte. Vielen Dank –

+0

Ich habe das herausgefunden. Danke vielmals. rettete meinen Tag –