与えられたデータベースに対してDatetimeを正規化したいと思います。統計を行うために日付を使用できる必要があります。ここで私はこれまで何をやったかである:Varcharでdatetime形式を統一する方法
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'
私はdatetime型としてキャストしようとしています、それは私にエラーを与える...ここではいくつかの例です:
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
は私がそれらをしたいと思います'02/13/2017 11:58:00 '
これを行う方法はありますか?ここで
は私が日付を取得するために行う方法です。
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'
これは、ログシステムからです。これらは機密情報なので、私は本当に多くの情報を入れることができません。しかし、コメントの末尾にタイムスタンプを付けてコメントを付ける人は、名前とタイムスタンプが含まれていることに注意してください。上の質問で、私はほとんどの日付を取得することができました。場合によっては、日付を取得する方法がありません(ログ内のタイムスタンプは一切ありません)。ここに私が与えることができる例があります:
Test Data
---------------------------------------------
FName LName 2/13/2017 1:19:42 PM
これを実行する非常に簡単な方法があります: 'DATETIME'値を' 'VARCHAR'の代わりに 'DATETIME'データ型を使用します。あなたは、データベース内の 'DATETIME'の提示で自分自身について心配するべきではありません。 – Siyual
あまりにも多くのパターンがある場合、ambiguosスタイルが使用される正しい日付を特定するための文字通りの方法はありません: '02-03-2017'は2月3日か3月2日ですか? – Lamak
それは2月13日2017です。しかし、それは何らかのテキスト内にあるので、私はdatetimeとしてそれを保存していません...私は手動で多くのテキストで日付を取得しています – InfiniteLoop