2017-02-13 2 views
0

Ich möchte meine Datetime für eine bestimmte Datenbank normalisieren. Ich muss das Datum verwenden können, um Statistiken zu machen. Hier ist, was ich bisher getan:Wie vereinheitliche ich das Datetime-Format in Varchar?

select 
CASE PATINDEX('%[0-9]/[0-9]/[0-9][0-9][0-9][0-9] [0-9]:[0-9][0-9]:[0-9][0-9]%',[Last Updated]) 
    WHEN 1 then 'Pattern1'--CAST([Last Updated] AS Datetime) --2/8/2017 2:30:14 PM 
    ELSE 
    CASE PATINDEX('%[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9]%',[Last Updated]) 
     WHEN 1 then 'Pattern2' --2015-03-02 03:46:38 PM 
     ELSE 
     CASE PATINDEX('%[0-9][0-9]/[0-9][0-9]/[0-9][0-9][0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9]%',[Last Updated]) 
      WHEN 1 THEN 'Pattern3' 
      ELSE 
      CASE PATINDEX('%[0-9]/[0-9][0-9]/[0-9][0-9][0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9]%',[Last Updated]) 
       WHEN 1 THEN 'Pattern4' 
       ELSE 
       CASE PATINDEX('%[0-9]/[0-9][0-9]/[0-9][0-9][0-9][0-9] [0-9]:[0-9][0-9]:[0-9][0-9]%',[Last Updated]) 
        WHEN 1 THEN 'Pattern5' 
        ELSE 
        CASE PATINDEX('%[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9] [0-9]:[0-9][0-9]:[0-9][0-9]%',[Last Updated]) 
         WHEN 1 THEN 'Pattern6' 
         ELSE 
         CASE PATINDEX('%[0-9][0-9]/[0-9][0-9]/[0-9][0-9][0-9][0-9] [0-9]:[0-9][0-9]:[0-9][0-9]%',[Last Updated]) 
          WHEN 1 THEN 'Pattern7' 
          ELSE 
          CASE PATINDEX('%[0-9]/[0-9]/[0-9][0-9][0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9]%',[Last Updated]) 
           WHEN 1 THEN 'Pattern8' 
           ELSE 
           CASE PATINDEX('%[0-9][0-9]/[0-9]/[0-9][0-9][0-9][0-9] [0-9]:[0-9][0-9]:[0-9][0-9]%',[Last Updated]) 
            WHEN 1 THEN 'Pattern9' 
            ELSE 
            CASE PATINDEX('%[0-9][0-9]/[0-9]/[0-9][0-9][0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9]%',[Last Updated]) 
             WHEN 1 THEN 'Pattern10' 






END 
    END 
     END 
      END 
       END 
        END 
         END 
          END 
           END 
            END 
as 'Pattern' 

Wenn ich versuche, wie Datetime zu werfen, es ist mir ein Fehler ... Hier sind einige Beispiele:

Pattern1: 
2/8/2017 8:06:56 AM 
2/2/2017 2:42:09 PM 
1/3/2017 9:10:20 AM 

Pattern 2: 
2016-12-20 11:08:20 
2016-11-09 10:04:35 
2016-11-01 10:53:11 AM 
2017-02-03 09:13:14 
2016-11-09 10:09:09 

Pattern3: 
12/14/2016 11:54:53 AM 
12/16/2016 11:05:24 AM 
12/19/2016 12:23:51 PM 

Pattern4: 
8/15/2016 12:13:35 PM 
4/17/2015 12:29:54 PM 
2/22/2016 10:44:11 AM 
6/12/2014 10:08:07 AM 
9/16/2013 12:18:22 PM 

Ich mag sie würde zu allen auf das Format normalisiert werden: '02/13/2017 11:58:00 '

Gibt es eine Möglichkeit, dies zu tun?

Hier ist, wie ich die Daten erhalten Sie auf:

WHEN (SUBSTRING(SUBSTRING(Cast(Resolution as varchar(8000)),LEN(/**/Cast(Resolution as varchar(8000))/**/) - CHARINDEX('---------------------------------------------',REVERSE(/**/Cast(Resolution as varchar(8000))/**/)),100),PATINDEX('%[0-9]%',SUBSTRING(Cast(Resolution as varchar(8000)),LEN(/**/Cast(Resolution as varchar(8000))/**/) - CHARINDEX('---------------------------------------------',REVERSE(/**/Cast(Resolution as varchar(8000))/**/)),100)),22)) = null THEN 'UNAVAILABLE' 
WHEN (SUBSTRING(SUBSTRING(Cast(Resolution as varchar(8000)),LEN(/**/Cast(Resolution as varchar(8000))/**/) - CHARINDEX('---------------------------------------------',REVERSE(/**/Cast(Resolution as varchar(8000))/**/)),100),PATINDEX('%[0-9]%',SUBSTRING(Cast(Resolution as varchar(8000)),LEN(/**/Cast(Resolution as varchar(8000))/**/) - CHARINDEX('---------------------------------------------',REVERSE(/**/Cast(Resolution as varchar(8000))/**/)),100)),22)) = '' THEN 'UNAVAILABLE' 
WHEN (SUBSTRING(SUBSTRING(Cast(Resolution as varchar(8000)),LEN(/**/Cast(Resolution as varchar(8000))/**/) - CHARINDEX('---------------------------------------------',REVERSE(/**/Cast(Resolution as varchar(8000))/**/)),100),PATINDEX('%[0-9]%',SUBSTRING(Cast(Resolution as varchar(8000)),LEN(/**/Cast(Resolution as varchar(8000))/**/) - CHARINDEX('---------------------------------------------',REVERSE(/**/Cast(Resolution as varchar(8000))/**/)),100)),22)) like '%--%' 
THEN 'UNAVAILABLE' 

ELSE 

    (Case 
    WHEN SUBSTRING(REVERSE((RTRIM(LTRIM((SUBSTRING(SUBSTRING(Cast(Resolution as varchar(8000)),LEN(/**/Cast(Resolution as varchar(8000))/**/) - CHARINDEX('---------------------------------------------',REVERSE(/**/Cast(Resolution as varchar(8000))/**/)),100),PATINDEX('%[0-9]%',SUBSTRING(Cast(Resolution as varchar(8000)),LEN(/**/Cast(Resolution as varchar(8000))/**/) - CHARINDEX('---------------------------------------------',REVERSE(/**/Cast(Resolution as varchar(8000))/**/)),100)),22)))))),0,5) 
    --FOR AM 
    LIKE '%MA%' THEN 
    SUBSTRING(SUBSTRING(Cast(Resolution as varchar(8000)),LEN(/**/Cast(Resolution as varchar(8000))/**/) - CHARINDEX('---------------------------------------------',REVERSE(/**/Cast(Resolution as varchar(8000))/**/)),100),PATINDEX('%[0-9]%',SUBSTRING(Cast(Resolution as varchar(8000)),LEN(/**/Cast(Resolution as varchar(8000))/**/) - CHARINDEX('---------------------------------------------',REVERSE(/**/Cast(Resolution as varchar(8000))/**/)),100)),22) 

    WHEN SUBSTRING(REVERSE((RTRIM(LTRIM((SUBSTRING(SUBSTRING(Cast(Resolution as varchar(8000)),LEN(/**/Cast(Resolution as varchar(8000))/**/) - CHARINDEX('---------------------------------------------',REVERSE(/**/Cast(Resolution as varchar(8000))/**/)),100),PATINDEX('%[0-9]%',SUBSTRING(Cast(Resolution as varchar(8000)),LEN(/**/Cast(Resolution as varchar(8000))/**/) - CHARINDEX('---------------------------------------------',REVERSE(/**/Cast(Resolution as varchar(8000))/**/)),100)),22)))))),0,5) 
    --FOR PM 
    LIKE '%MP%' THEN 
    SUBSTRING(SUBSTRING(Cast(Resolution as varchar(8000)),LEN(/**/Cast(Resolution as varchar(8000))/**/) - CHARINDEX('---------------------------------------------',REVERSE(/**/Cast(Resolution as varchar(8000))/**/)),100),PATINDEX('%[0-9]%',SUBSTRING(Cast(Resolution as varchar(8000)),LEN(/**/Cast(Resolution as varchar(8000))/**/) - CHARINDEX('---------------------------------------------',REVERSE(/**/Cast(Resolution as varchar(8000))/**/)),100)),22) 

    ELSE 

     (CASE 
     WHEN LEN(RTRIM(LTRIM((SUBSTRING(SUBSTRING(Cast(Resolution as varchar(8000)),LEN(/**/Cast(Resolution as varchar(8000))/**/) - CHARINDEX('---------------------------------------------',REVERSE(/**/Cast(Resolution as varchar(8000))/**/)),100),PATINDEX('%[0-9]%',SUBSTRING(Cast(Resolution as varchar(8000)),LEN(/**/Cast(Resolution as varchar(8000))/**/) - CHARINDEX('---------------------------------------------',REVERSE(/**/Cast(Resolution as varchar(8000))/**/)),100)),22))))) <20 
     THEN 'UNAVAILABLE' 


     ELSE 

      LEFT(RTRIM(LTRIM((SUBSTRING(SUBSTRING(Cast(Resolution as varchar(8000)),LEN(/**/Cast(Resolution as varchar(8000))/**/) - CHARINDEX('---------------------------------------------',REVERSE(/**/Cast(Resolution as varchar(8000))/**/)),100),PATINDEX('%[0-9]%',SUBSTRING(Cast(Resolution as varchar(8000)),LEN(/**/Cast(Resolution as varchar(8000))/**/) - CHARINDEX('---------------------------------------------',REVERSE(/**/Cast(Resolution as varchar(8000))/**/)),100)),22)))), 
      LEN(RTRIM(LTRIM((SUBSTRING(SUBSTRING(Cast(Resolution as varchar(8000)),LEN(/**/Cast(Resolution as varchar(8000))/**/) - CHARINDEX('---------------------------------------------',REVERSE(/**/Cast(Resolution as varchar(8000))/**/)),100),PATINDEX('%[0-9]%',SUBSTRING(Cast(Resolution as varchar(8000)),LEN(/**/Cast(Resolution as varchar(8000))/**/) - CHARINDEX('---------------------------------------------',REVERSE(/**/Cast(Resolution as varchar(8000))/**/)),100)),22)))))-2) 


      END) 

     END) 

END) 

as 'Last Updated' 

Dieses wird von einem Protokollsystem ist. Ich kann nicht wirklich viele Informationen eingeben, da diese vertraulich sind. Beachten Sie jedoch, dass es viele Personen gibt, die Kommentare mit einem Zeitstempel am Ende ihrer Kommentare platzieren müssen, einschließlich ihres Namens und des Zeitstempels. Mit der Abfrage da oben konnte ich die meisten Termine bekommen. Manchmal gibt es einfach keine Möglichkeit, das Datum zu bekommen (im Protokoll steht überhaupt kein Zeitstempel). Hier ist das Beispiel, das ich geben kann:

Test Data 
--------------------------------------------- 
FName LName 2/13/2017 1:19:42 PM 
+8

Es ist eine sehr einfache Art und Weise, dies zu tun: Laden 'DATETIME' Werte als' DATETIME' Datentyp anstelle von 'VARCHAR'. Sie sollten sich nicht mit der Präsentation eines 'DATETIME' in der Datenbank beschäftigen. – Siyual

+4

Wenn es so viele Muster gibt, gibt es buchstäblich keine Möglichkeit, das richtige Datum zu kennen, wenn ein ambiguos Stil verwendet wird: '02-03-2017' ist der 3. Februar oder der 2. März? – Lamak

+0

Es ist 13. Februar 2017. Aber die Sache ist, dass ich es nicht als Datetime speichern, weil es innerhalb eines Textes liegt ... Ich erhalte manuell das Datum in viel Text – InfiniteLoop

Antwort

1

Ich denke, es gibt eine einfachere Lösung für Ihr Problem. Hier ist ein Vorschlag:

SELECT CONVERT(datetime, any_datetime_format) unified_datetime 
from 
(
    SELECT '2/8/2017 8:06:56 AM' any_datetime_format UNION 
    SELECT '2/2/2017 2:42:09 PM' any_datetime_format UNION 
    SELECT '1/3/2017 9:10:20 AM' any_datetime_format UNION 
    SELECT '2016-12-20 11:08:20' any_datetime_format UNION 
    SELECT '2016-11-09 10:04:35' any_datetime_format UNION 
    SELECT '2016-11-01 10:53:11 AM' any_datetime_format UNION 
    SELECT '2017-02-03 09:13:14' any_datetime_format UNION 
    SELECT '2016-11-09 10:09:09' any_datetime_format UNION 
    SELECT '12/14/2016 11:54:53 AM' any_datetime_format UNION 
    SELECT '12/16/2016 11:05:24 AM' any_datetime_format UNION 
    SELECT '12/19/2016 12:23:51 PM' any_datetime_format UNION 
    SELECT '8/15/2016 12:13:35 PM' any_datetime_format UNION 
    SELECT '4/17/2015 12:29:54 PM' any_datetime_format UNION 
    SELECT '2/22/2016 10:44:11 AM' any_datetime_format UNION 
    SELECT '6/12/2014 10:08:07 AM' any_datetime_format UNION 
    SELECT '9/16/2013 12:18:22 PM' any_datetime_format 
) t 

Wenn das Format nicht geeignet ist und Sie wirklich brauchen so etwas wie ‚2017.02.13 01.19.42‘ können Sie ersetzen 'CONVERT (datetime, any_datetime_format) 'durch' FORMAT (konvertieren (Datumzeit, any_datetime_format), 'mM/tt/HH: mm: ss tt') '

+0

Ich habe gerade die Daten in einer temporären Tabelle hinzugefügt und konnte es so machen. Danke für Ihre Hilfe – InfiniteLoop

Verwandte Themen