1

私は1つの列capturedatetime(Char(30))を持っています:

2006-04-25T15:50:59.997000 PM

そして、それを変換して、DateTime にある他のテーブル列にロードしたいと考えています。T-sqlまたはSSISのいずれかによって。

私は試してみました:

select CONVERT(datetime, '2006-04-25T15:50:59.997000 PM', 126) 

しかし、それはエラーを作成します:

文字列から日時を変換する際に変換に失敗しました

遅い更新:

このコラムには、まったく異なる形式の他のデータもあります。

29-JAN-10 08.57.41.000000 PM
4

4 に答える 4

2

(1)文字列列に日時データを格納するのをやめてください! これは何も、問題ではありません。

(2) なぜあなたの列は有効でさえない 2 つの異なる文字列形式でデータを取得するのですか? 文字列が 24 時間制使用し、 AM/PM 接尾辞が付いているのはなぜですか? なぜ地域の文字列形式と Y2K 災害のようなものを使用するの29-JAN-10ですか?

これが1つの方法ですが、それはひどく醜いです。SSIS プロセスを修正して、日時としてではなくても、少なくとも有効な ISO 文字列 ( yyyy-mm-ddThh:mm:ss.nnn)として最初に有効な日時の値を提供することを強くお勧めします。

DECLARE @x TABLE (d CHAR(30));

INSERT @x SELECT '2006-04-25T15:50:59.997000 PM'
  UNION ALL SELECT '29-JAN-10 08.57.41.000000 PM';

SET LANGUAGE ENGLISH; -- this is important, else style 6 may not work

SELECT 
  CASE WHEN d LIKE '__[0-9]%' THEN 
    CONVERT(DATETIME, LEFT(d, 23))
  WHEN d LIKE '[0-9][0-9]-%' THEN
    CONVERT(DATETIME, CONVERT(CHAR(8),
    CONVERT(DATETIME,REPLACE(LEFT(d,9),' ','-'),6),112) 
    + ' ' + REPLACE(SUBSTRING(d,11,8),'.',':') 
    + ' ' + RIGHT(RTRIM(d),2))
  END
FROM @x;
于 2013-08-21T19:50:36.200 に答える
0
select convert(datetime,left('2006-04-25T15:50:59.997000 PM',23))

また

select convert(datetime,left(capturedatetime,23))
于 2013-08-21T19:50:05.800 に答える
0

126 の変換にはスペースは必要ありません...次のように動作するようにしました:

declare @T varchar(50)
declare @dt datetime

set @T = '2006-04-25T15:50:59.997' 
set @dt = convert(datetime,@t,126)

select @T, @dt
于 2013-08-21T19:50:58.783 に答える