2017-12-14 5 views
0

私は私の地元でこれを実行したとき、次のスクリプトはなぜSQL Serverの日付フォーマットは、タイムスタンプ

SELECT cast('2017-12-14 14:30:41.007' as datetime) 

を使用してSQLサーバーの日時フィールドに日付を含むvarchar型に変換しようとしていると日付変換に影響を与えませんDateFormat mydを使用するマシンは正常に動作し、有効なdatetimeを返しました。 「:30:2017年12月14日14 41.007」私はDATEFORMATのDYMを使用しています私のサーバー上でこのステートメントを実行したとき は、サーバーが次のエラーが返さ

The conversion of a varchar data type to a datetime data type resulted in an out-of-range value. 

なぜ「MYD」の下で有効な日時ではなく、下に"dym"でも "myd"でもないのに "dym"ですか?

私は

+1

言語中立形式を使用しなかったためです。 yyyymmddを使用します。hh:nn:ss – GuidoG

+1

http://karaszi.com/the-ultimate-guide-to-the-datetime-datatypes – GuidoG

+1

フォーマット(実際にはほとんどの言語)のフォーマットがSQL Serverによって「yyyy -dd-mm'となる。 https://www.mssqltips.com/sqlservertip/5206/sql-server-datetime-best-practices/ –

答えて

0

それはあります。あなたが11から14に変更し、このスクリプトを実行した場合、あなたは違いが表示されます。すべての時間形式が日付と時刻の真ん中にTを入れたため

SET DATEFORMAT myd 
SELECT DATEPART(month,cast('2017-12-11 14:30:41.007' as datetime)) 

SET DATEFORMAT dym 
SELECT DATEPART(month,cast('2017-12-11 14:30:41.007' as datetime)) 

/* 

Output: 
12 
11 

*/ 

は物事の一貫性を保つために。これにより、SQLサーバーは日付がISO8601形式であると判断します。

SET DATEFORMAT myd 
SELECT DATEPART(month,cast('2017-12-11T14:30:41.007' as datetime)) 

SET DATEFORMAT dym 
SELECT DATEPART(month,cast('2017-12-11T14:30:41.007' as datetime)) 

/* 

Output: 
12 
12 

*/ 
0

'2017-12-14 14:30:41.007'は時間をミリ秒単位のデフォルトの標準とODBC標準に従うように見えるSQLサーバーで何が起こっているのか理解したいのでところで、私が求めている問題に対する回避策を発見した、日付、 datetime2、およびdatetimeoffsetです。あなたがMS SQLを使用している場合は、文字列パラメータの特定のスタイルに対応するためCONVERTを使用することができます:SQLサーバーが月の数として14を解釈して、わずか12ヶ月があるので

SELECT convert(datetime,'2017-12-14 14:30:41.007' , 121) 
関連する問題