2017-01-05 2 views
1

データ型がvarchartest_macの列があります。例えばのためにHHをフォーマットするためのvarcharデータ型の値を検証します。

値は、その列にあるだろう、次

create table test_mac 
(
    time_in varchar(200) 
) 

insert into test_mac values ('23:15') 
insert into test_mac values ('23:1') 
insert into test_mac values ('23:12') 
insert into test_mac values ('sdfdsfs') 
insert into test_mac values ('23/15') 
insert into test_mac values ('2315') 
insert into test_mac values ('2:15') 
insert into test_mac values ('23:') 

私は現在、これをやっている:私は必要

select * 
from test_mac 
where time_in LIKE '%[0-2][0-9]:[0-5][0-59]' 
    and ISDATE(time_in) = 1 

期待される結果は次のとおりです。

23:15 
23:1 
23:12 
2:15 

する必要があります有効時間。値が23通りある場合:1私は23時10分または2時15分に2時15分のためにそれらを更新する必要があり、

上記はテストdata.Have GOTだけの作成です有効な時間を入力するだけの場所を適用する

+1

使用しているSQLのバージョンにタグを付けてください – TheGameiswar

+3

Aaron Bertrandの[習慣が悪い:間違ったデータ型を選択]を読んでください(http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/12/bad-habits -zero-data-type.aspxを使用する) –

+0

@ ZoharPeled建築家がすでに設計していて、問題として取り組む機会があれば、助けてもらえません。 – Malcolm

答えて

2

美しいソリューションは、あなたが探しているものでない場合は、ここで私は仕事をするために迅速に書いた少し長いったらしいハック解決策だ、それは軽くテストして、サンプルデータで動作されています:

CREATE TABLE #test_mac 
    (
     time_in VARCHAR(200) , 
     formatted VARCHAR(10) 
    ); 

INSERT INTO #test_mac 
VALUES ('23:15', NULL), 
     ('23:1', NULL), 
     ('23:12', NULL), 
     ('sdfdsfs', NULL), 
     ('23/15', NULL), 
     ('2315', NULL), 
     ('2:15', NULL), 
     ('23:', NULL); 


UPDATE #test_mac 
SET  formatted = CASE WHEN LEN(SUBSTRING(time_in, 0, 
              CHARINDEX(':', time_in))) = 2 
         THEN SUBSTRING(time_in, 0, CHARINDEX(':', time_in)) 
         ELSE '0' + SUBSTRING(time_in, 0, 
               CHARINDEX(':', time_in)) 
        END + ':' 
     + CASE WHEN LEN(SUBSTRING(time_in, CHARINDEX(':', time_in) + 1, 2)) = 2 
       THEN SUBSTRING(time_in, CHARINDEX(':', time_in) + 1, 2) 
       ELSE SUBSTRING(time_in, CHARINDEX(':', time_in) + 1, 1) + '0' 
      END 
WHERE time_in LIKE '%[0-9]:[0-5]%' -- looks for a single digit before & after 
     AND LEN(time_in) <= 5; -- length must be 5 characters or less 

SELECT * 
FROM #test_mac 
WHERE formatted IS NOT NULL; 

DROP TABLE #test_mac; 
2

try_convertを使用してこれを行うことができます。無効な値はnullと表示されます。

select time_in,try_convert(time,time_in) 
from test_mac 

編集:それらに:文字を持たない値を処理するために、あなたはcase表現を使用することができます。

select time_in, 
case when charindex(':',time_in) = 0 then null else try_convert(time,time_in) end 
from test_max 

また23:123:10に変換しなければならないという仮定が偽です。 23:6のような値があるとしたら、23:60の代わりに23:06に変換する必要があります。

+0

それはうまく見えますが、データ23:1の場合は23:01と表示され、23:10でなければなりません。また、2315が含まれていますので、無効にする必要があります。 – Malcolm

+0

答えを少し編集しました。 –

関連する問題