4

テーブルにを挿入する必要がありvarcharます。表のタイプはdatetimeなので、変換する必要があります。これが大きな問題になるとは思いませんでしたが、1900-01-01 00:00:00.000希望の日付の代わりに挿入し続けます。変換した日付で選択を行うと、正しい日付が表示されます。

コードをお見せします:

INSERT INTO Item (CategoryId, [Date], Content, CreatedOn)
   SELECT 
       CategoryId, Convert(datetime, '28/11/2012', 103), Content, GetDate()
   FROM 
       Item i
   JOIN 
       Category c ON i.CategoryId = c.Id
   JOIN 
       Division d ON d.Id = c.DivisionId
   WHERE 
       Date = Convert(datetime, '31/03/2005', 103) 
       AND d.Id = '142aaddf-5b63-4d53-a331-8eba9b0556c4'

where句は完全に機能し、必要なフィルタリングされたアイテムを提供します。変換された日付を除いて、すべてのデータが正しく挿入されます。私が1900年に言ったようなギブ-...

選択するだけの場合:

SELECT CategoryId, Convert(datetime, '28/11/2012', 103), Content, GetDate()
FROM Item i
JOIN Category c ON i.CategoryId = c.Id
JOIN Division d ON d.Id = c.DivisionId
WHERE Date = Convert(datetime, '31/03/2005', 103) AND d.Id = '142aaddf-5b63-4d53-a331-8eba9b0556c4'

正しい日付は次のとおり2012-11-28 00:00:00.000です。私は次のような別の変換を使用しようとしました:

Convert(datetime, '20121128')

しかし、それでも同じ問題が発生します。私が間違っていることを見ている人はいますか?

どうも

4

2 に答える 2

10

文字列ベースの日付形式を使用する必要がある場合は、日付形式、言語、および地域の設定に関係なく、安全ですべてのSQLServerインスタンスで機能するものを選択する必要があります。

その形式はISO-8601形式として知られており、どちらかです。

YYYYMMDD      (note: **NO** dashes!)

また

YYYY-MM-DDTHH:MM:SSS

DATETIME列の場合。

だから代わりに

Convert(datetime, '28/11/2012', 103)

あなたが使用する必要があります

CAST('20121128' AS DATETIME)

そして、あなたは元気になるはずです。

SQL Server 2008を使用している場合は、日付のみ(時間部分なし)が必要な場合にDATE(の代わりに)を使用することも検討できます。それは、使用して時間部分を常に持つDATETIMEよりもさらに簡単ですDATETIME00:00:00

于 2012-11-28T08:48:11.833 に答える
0

数年後、私の問題の答えを見つけようとして、このSOの質問(および他の多くの質問)を見つけたという事実を捨てたかっただけです。

ストアドプロシージャ内でこれをトラブルシューティングしている場合、ストアドプロシージャのパラメータは、変更する必要がある場所です。私がトラブルシューティングしているコードを作成したプログラマーは@ddt CHAR(10)、ストアドプロシージャ内で変更を加えなくても、問題を解決しました。パラメータをに変更する必要がありました@ddt smalldatetime

于 2019-10-09T18:35:12.520 に答える