1

のようなVARCHARデータを変換するにはどうすればよいですか?'20130120161643730'DATETIME

CONVERT(DATETIME, '20130120161643730')動作しません。

ただし、CONVERT (DATETIME, '20130120 16:16:43:730')動作します。正しい形式のデータが必要だと思います。

DATETIMEフォーマットされていないデータから直接変換するために使用できる有効な方法はありますか?

私の解決策は次のとおりです。

DECLARE @Var VARCHAR(100) = '20130120161643730'

SELECT CONCAT(LEFT(@Var,8),' ',SUBSTRING(@var,9,2),':',SUBSTRING(@var,11,2),':',SUBSTRING(@var,13,2),':',RIGHT(@Var,3))

それは正常に動作します。ただし、コンパクトなソリューションを探しています。

4

3 に答える 3

2

STUFFダッシュを強制せず、代わりにを使用することで、もう少しコンパクトにすることができますSUBSTRING

DECLARE @Var VARCHAR(100) = '20130120161643730';

SET @Var = LEFT(@Var, 8) + ' ' 
  + STUFF(STUFF(STUFF(RIGHT(@Var, 9),3,0,':'),6,0,':'),9,0,'.');

SELECT [string] = @Var, [datetime] = CONVERT(DATETIME, @Var);

結果:

string                  datetime
---------------------   -----------------------
20130120 16:16:43.730   2013-01-20 16:16:43.730
于 2013-08-07T13:57:04.843 に答える
1
DECLARE @var VARCHAR(100) = '20130120161643730'
SELECT convert(datetime,(LEFT(@var,8)+' '+SUBSTRING(@var,9,2)+':'+SUBSTRING(@var,11,2)+':'+SUBSTRING(@var,13,2)+':'+RIGHT(@var,3)))

このタイプの文字列を日時に変換する唯一の方法は、文字列を分割してから DateTime に変換することです。また、Concat は MS SQL では機能しませんが、"+" です。

于 2013-08-07T13:53:05.767 に答える
0

この形式が定期的に使用されるものであると仮定すると、文字列を解析して有効な日時に変換する UDF (ユーザー定義関数) を作成すると、よりコンパクトになります。

したがって、次のようなものがあります。

create function dbo.ParseDate (@var varchar(max)) returns datetime as
begin
  return (convert(datetime,(LEFT(@var,8)+' '+SUBSTRING(@var,9,2)+':'+SUBSTRING(@var,11,2)+':'+SUBSTRING(@var,13,2)+':'+RIGHT(@var,3))))
end

次に、次のようにその関数から選択できます。

select dbo.ParseDate('20130120161643730')

そのため、日付を参照する必要があるコードはよりコンパクトになります。

于 2013-08-07T13:56:44.217 に答える