私は次のようなテーブルを作ろうとしていた、
create table table1(date1 datetime,date2 datetime);
まず、以下のように値を挿入してみました、
insert into table1 values('21-02-2012 6:10:00 PM','01-01-2001 12:00:00 AM');
というエラーが出ました、
というエラーが表示されました。
そこで、スタックオーバーフローで提案されていた以下の形式を試してみました、
insert into table1 values(convert(datetime,'21-02-2012 6:10:00 PM',5)
,convert(datetime,'01-01-2001 12:00:00 AM',5));
しかし、まだエラーが出ます、
日付や時刻を文字列から変換する際に、変換に失敗しました。
何か提案はありますか?
SQL Serverでサポートされている形式は数多くあります - MSDN Books OnlineのCASTとCONVERTを参照してください。これらのフォーマットのほとんどは、設定に**依存しています。
これを解決する方法は、SQL ServerがサポートしているISO-8601日付書式を使用することです。
ISO-8601形式]2はSQL Serverでサポートされており、2種類の形式があります:
または
を日付と時刻に使用する - ここで注意: このフォーマットにはダッシュがあり(省略可能)、また
DATETIMEの日付と時刻の間の区切り文字として
T` が固定されています。これはSQL Server 2000以降で有効です。
ですから、具体的なケースでは、これらの文字列を使用してください:
insert into table1 values('2012-02-21T18:10:00', '2012-01-01T00:00:00');
とすれば問題ないでしょう(注:この場合、12時間のAM/PMフォーマットではなく、国際的な24時間フォーマットを使用する必要があります)。
別の方法として: SQL Server 2008またはそれ以降のバージョンであれば、(単なるDATETIME
の代わりに)DATETIME2
データ型を使用することもできます!:-)DATETIME2`はより優れており、変換にあまりこだわらないので、SQL Server 2008以降で推奨される日付/時刻データ型です。
SELECT
CAST('02-21-2012 6:10:00 PM' AS DATETIME2), -- works just fine
CAST('01-01-2012 12:00:00 AM' AS DATETIME2) -- works just fine
なぜこのトピック全体が厄介で、少々混乱しているのかは聞かないでください。しかし、YYYYMMDD
形式であれば、SQL Serverのどのバージョンでも、SQL Serverのどの言語と日付形式の設定でも問題ありません。
5がイタリア語のquot;yy"で、105がイタリア語のquot;yyyy"である。従って
SELECT convert(datetime,'21-02-12 6:10:00 PM',5)
は正しく動作しますが
SELECT convert(datetime,'21-02-12 6:10:00 PM',105)
はエラーを出します。
同様に
SELECT convert(datetime,'21-02-2012 6:10:00 PM',5)
はエラーになります。
SELECT convert(datetime,'21-02-2012 6:10:00 PM',105)
は動作します。
可能な限り文化固有の日付/時刻リテラルを避ける必要があります。
日付/時刻をリテラルとして提供するためのいくつかのセキュア形式があります。
2016-09-15 17:30:00
のすべての例。
-{ts'2016-09-15 17:30:00 '}
--Time Stamp。
-{d'2016-09-15 '}
--日付のみ。
-{t'17:30:00 '}
--Time only。
-'2016-09-15T17:30:00 '
--中央の T
に注意してください。!
-'20160915 '
--純粋な日付のみ。
-6月31日または2月30日はありません。..
SQL-Serverは、予想外の実行順で物事を実行することをよく知っています。 書面による説明は、変換が前に行われるように見えますが、エンジンは、なぜか-後のステップで変換を行うことにしました。
これが例で説明する素晴らしい記事です:[Rusano.com: "t-sql-functions-do-no-imply-a-certain-order-of-execution"](http://rusanu.com/2011/08/10/sql-functions-do-no-imply-a-certain-over-ec.
最善の方法はこのコードです。
"select * from [table_1] where date between convert(date,'" + dateTimePicker1.Text + "',105) and convert(date,'" + dateTimePicker2.Text + "',105)"
これを試してみてください。
SQL Serverは、MM / DD / YYYY形式で日付を想定しています。英語がデフォルトの言語として設定されている場合、ここでdatepicker値をsql2008データベースに保存します。私のフィールドタイプはdatetime in databaseです。dpdobは私のdatepicker名です。
Dim test = dpdob.Text.Replace("-", "/")
Dim parts As String() = test.Split(New Char() {"/"c})
Dim firstPart As String = parts(0)
Dim thirdPart As String = parts(2)
Dim secondPart As String = parts(1)
Dim test1 = secondPart + "/" + firstPart + "/" + thirdPart
Dim dob = test1
次に、挿入クエリでdobを使用します。
convert(datetime2,((SUBSTRING( ISNULL(S2.FechaReal,e.ETA),7,4)+'-'+ SUBSTRING( ISNULL(S2.FechaReal,e.ETA),4,2)+'-'+ SUBSTRING( ISNULL(S2.FechaReal,e.ETA),1,2) + ' 12:00:00.127'))) as fecha,
nvarcharフィールドに挿入していた文字列に getdate()
を連結しようとしたときに、この問題がありました。
私はそれを回避するためにいくつかのキャスティングをしました:
INSERT INTO [SYSTEM_TABLE] ([SYSTEM_PROP_TAG],[SYSTEM_PROP_VAL]) VALUES
(
'EMAIL_HEADER',
'<h2>111 Any St.<br />Anywhere, ST 11111</h2><br />' +
CAST(CAST(getdate() AS datetime2) AS nvarchar) +
'<br /><br /><br />'
)
それは消毒された例です。 その重要な部分は次のとおりです。
。..'+ CAST(CAST(getdate()AS datetime2)AS nvarchar)+'。..
。
日付を「datetime2」としてキャストし、次に「nvarchar」としてキャストして連結しました。