2011-06-19 2 views
1

インスタンスの指示SELECT CONVERT(NVARCHAR(30), GETDATE(), 114)出力、代わりに間違ったミリ秒の区切りのSQL Server 2005

13:04:31.997 

13:04:31:997 

はなぜミリ秒の区切り:である理由私は本当に理解することはできませんinsted .?あなたが知る必要がある場合は、ある時間がテーブルにXMLとして格納された2つの時間値の間であるかどうかを確認する必要があります。問題は、この表の区切り文字は普通のように.なので、2つの形式の比較では.を使用し、もう1つは:を使用するため、間違った結果が返されるということです。 REPLACEのような文字列関数を使用せずに、またはテーブルに格納されているフォーマットを変更せずに、.セパレータで時刻を取得する方法はありますか?

答えて

1

比較を行うときには、フォーマットをdatetimeにしてください。 SQL Server 2008には有用な新しいデータ型timeがありますが、SQL Server 2005では代わりにdatetimeを使用する必要があります。

convert(..., 114)を使用して、datetime変数から時刻部分のみを取得していると思います。このコードを使用して日付部分を削除しても、datetimeという変数を使用することができます。

declare @dt datetime 
set @dt = '2001-01-01T10:01:02.000' 
select dateadd(d, datediff(d, @dt, 0), @dt) 

結果:

1900-01-01 10:01:02.000 

あなたが使用するデータ型を指定.valueを使用してXMLからデータを抽出します。 XMLにtime部分のみがあり、datetimeと指定すると、日付 '1900-01-01'の時刻が取得されます。したがって、このようにdatetimeを使用して比較を行うことができます。

declare @T table (ID int, XMLCol xml) 

insert into @T 
select 1, '<t1>10:01:01.123</t1><t2>10:01:02.123</t2>' union all 
select 2, '<t1>11:01:01.123</t1><t2>11:01:02.123</t2>' 

declare @dt datetime 
set @dt = '2001-01-01T10:01:02.000' 

select T.ID 
from @T as T 
where dateadd(d, datediff(d, @dt, 0), @dt) between 
     T.XMLCol.value('t1[1]', 'datetime') and 
     T.XMLCol.value('t2[1]', 'datetime') 

結果:

ID 
1 
2

the documentationスタイル114のために言うまさにだ:

HH:MI:SS:MMM(24時間)

私が使用したセパレータを変更するのいずれかの方法を知っていません。現在の日付をテキスト値に変換するのではなく、XML形式の値をdatetimeに変換することをお勧めします。結局のところ、文字列ではなく、日付と時刻を論理的に比較しています。

+0

あなたは正しいですが、文字列の順序は正確に同じ結果を与え、そして私はそれを使用しています理由です。 –

+0

@SQL:代わりに別の方法に変換することで、文字列の書式設定について心配する必要はありません。これは一般的にはより良いアプローチです - データを、それより離れてではなく、最も論理的なデータ形式に変換してください。 –

関連する問題