2017-02-13 3 views
0

与えられたデータベースに対して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 
+8

これを実行する非常に簡単な方法があります: 'DATETIME'値を' 'VARCHAR'の代わりに 'DATETIME'データ型を使用します。あなたは、データベース内の 'DATETIME'の提示で自分自身について心配するべきではありません。 – Siyual

+4

あまりにも多くのパターンがある場合、ambiguosスタイルが使用される正しい日付を特定するための文字通りの方法はありません: '02-03-2017'は2月3日か3月2日ですか? – Lamak

+0

それは2月13日2017です。しかし、それは何らかのテキスト内にあるので、私はdatetimeとしてそれを保存していません...私は手動で多くのテキストで日付を取得しています – InfiniteLoop

答えて

1

あなたの問題のためのより簡単な解決策があると思います。ここで命題は次のとおりです。

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 

形式が適切でないと、あなたが本当に「2017年2月13日午前1時19分42秒PM」のようなものが必要な場合は、「CONVERT(datetime型、any_datetime_format)を置き換えることができます 'によって' FORMAT(変換(datetime、any_datetime_format)、 'MM/dd/yyyy HH:mm:ss tt') '

+0

私はちょうどテンポラリテーブルの日付を追加し、それをそのようにすることができました。ご協力いただきありがとうございます – InfiniteLoop

関連する問題