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
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
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
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