C#を使用したDateTime形式からSQL形式への変換


111

現在の日付時刻形式をC#から保存し、SQL Serverの日付形式に変換してyyyy-MM-dd HH:mm:ssUPDATEクエリで使用できるようにしています。

これは私の最初のコードでした:

DateTime myDateTime = DateTime.Now;
string sqlFormattedDate = myDateTime.Date.ToString("yyyy-MM-dd HH:mm:ss");

日付の出力は問題ありませんが、時間は常に「12:00:00」なので、コードを次のように変更しました。

string sqlFormattedDate = myDateTime.Date.ToString("yyyy-MM-dd") + " " + 
myDateTime.TimeOfDay.ToString("HH:mm:ss");

それは私にこのコンパイルエラーを与えました:

FormatExceptionが処理されませんでした

そして、私が解析する必要があることを示唆しました。だから私はここStackOverflowで私の研究に従って私のコードにこれをやってみました:

string sqlFormattedDate = myDateTime.Date.ToString("yyyy-MM-dd") + " " + 
myDateTime.Parse.TimeOfDay.ToString("HH:mm:ss");

または

string sqlFormattedDate = myDateTime.Date.ToString("yyyy-MM-dd") + " " + 
myDateTime.tryParse.TimeOfDay.ToString("HH:mm:ss");

しかし、これは、特定のコンテキストでは無効なメソッドであることを教えてくれます。私は自分の問題の解決策を探してみましたが、2時間もたってしまいました。私はまだC#で​​少し新しいですが、私を助けてくれますか?


DateTime.TryParseExactを見ましたか?
Tim


3
パラメータを使用してを更新しDateTimeないのですか、それを文字列として保存していますか?またToString、オンのDate場合、時間は常に12:00:00
V4Vendetta 2013

3
型のパラメーターを持つパラメーター化されたクエリを使用する必要があります。DATETIMEそうすることで、文字列表現との間で相互に変換することをすべて回避できます。
marc_s 2013

5
他の人が言ったように、パラメータを使用し、すべてをとして維持datetimeすることは良いスタートです。さらに良いことに、なぜサーバーに現在の時刻を渡すのですか?GETDATE()サーバー側で完全に呼び出すことができる関数があります。
Damien_The_Unbeliever 2013

回答:


219

以下でこれを試してください

DateTime myDateTime = DateTime.Now;
string sqlFormattedDate = myDateTime.ToString("yyyy-MM-dd HH:mm:ss.fff");

私は文字列sqlFormattedDate = myDateTime.DateTime ...を試してみてありがとうございました...何らかの理由でこれは私が達成したいものです。
エースカセリヤ2013

stackoverflowでの検索で、間違った参照が何度も表示されますが、質問には何度も回答がありました。私のような初心者は、これが原因で関係を結ぶことができません。申し訳ありませんが、できるだけ早く質問を終了します。
エースカセリヤ2013

1
C#の「Sortable」フォーマットでも同じことができると思います。したがって、myDateTime.ToString( "s");を実行できます。
ProVega 2014年

@ProVegaそれは同じに見えません(.ToString( 's')には日付と時刻の間にスペースの代わりにTがあります)-SQLサーバーでTの有無にかかわらず同じように解析されていることを確認できます(私は2012年です)。私はロギングの日時フォーマットとして「s」を使い始めたので、私はそう思うと思います。ありがとう!
Ian Grainger 2016年

ええ、公式ページのCASTおよびCONVERT(Transact-SQL)ではyyyy-MM-dd、時刻からスペースで区切られたフォームに「ODBC canonical」という名前を使用し、区切り文字があるフォームに「ISO8601」という名前を使用していますA T。しかし、はい、どちらの形式も暗黙的に(そして正しく)に変換されますdatetime
Jeppe Stig Nielsen

44

標準の日時フォーマット "s"を使用すると、国際化の互換性も保証されます(MM / ddとdd / MM)。

myDateTime.ToString("s");

=> 2013-12-31T00:00:00

完全なオプション:(コード:サンプル結果)

d: 6/15/2008 
D: Sunday, June 15, 2008 
f: Sunday, June 15, 2008 9:15 PM 
F: Sunday, June 15, 2008 9:15:07 PM 
g: 6/15/2008 9:15 PM 
G: 6/15/2008 9:15:07 PM 
m: June 15 
o: 2008-06-15T21:15:07.0000000 
R: Sun, 15 Jun 2008 21:15:07 GMT 
s: 2008-06-15T21:15:07 
t: 9:15 PM 
T: 9:15:07 PM 
u: 2008-06-15 21:15:07Z 
U: Monday, June 16, 2008 4:15:07 AM 
y: June, 2008 

'h:mm:ss.ff t': 9:15:07.00 P 
'd MMM yyyy': 15 Jun 2008 
'HH:mm:ss.f': 21:15:07.0 
'dd MMM HH:mm:ss': 15 Jun 21:15:07 
'\Mon\t\h\: M': Month: 6 
'HH:mm:ss.ffffzzz': 21:15:07.0000-07:00

.NET Frameworkでサポート:4.6、4.5、4、3.5、3.0、2.0、1.1、1.0
リファレンス:DateTime.ToStringメソッド


1
これは十分にきめ細かく(ミリ秒が足りない)ため、日付による順序付けに依存するクエリで問題が発生します。
reijerh 2017年

時間と分も取得するには、次の変換を使用できます
1

9

正解はすでに「使用パラメータ」が与えられています。日付をフォーマットしてSQL-Serverに文字列として渡すと、サーバー側で日付を解釈する方法の設定に依存するため、エラーが発生する可能性があります。ヨーロッパでは、2012年12月1日を示すために「1.12.2012」と表記しますが、他の国では1月12日として扱われる場合があります。

SSMSでステートメントを直接発行するとき、私はyyyymmdd非常に一般的なフォーマットを使用します。これまでに取り組んださまざまなインストールで問題は発生しませんでした。

めったに使用されない形式がもう1つあります。これは少し奇妙ですが、すべてのバージョンで機能します。

select { d '2013-10-01' }

2013年10月1日を返します。

select { ts '2013-10-01 13:45:01' }

10月1日午後1:45:01を返します

パラメータを使用し、独自にフォーマットしたステートメントフラグメントを貼り付けてSQLコードをフォーマットしないことを強くお勧めします。これはSQLインジェクションと奇妙なエラーのエントリです(float値のフォーマットも別の潜在的な問題です)。


3

あなたの最初のコードはこれを行うことで動作します

DateTime myDateTime = DateTime.Now;
string sqlFormattedDate = myDateTime.ToString("yyyy-MM-dd HH:mm:ss"); //Remove myDateTime.Date part 

3

あなたの問題は、DateTime日付のみに切り捨てられる「日付」プロパティにあります。あなたはこのように変換を置くことができます:

DateTime myDateTime = DateTime.Now;
string sqlFormattedDate = myDateTime.ToString("yyyy-MM-dd HH:mm:ss"); // <- No Date.ToString()!

2

私が探していた答えは:

DateTime myDateTime = DateTime.Now;
string sqlFormattedDate = myDateTime.ToString("yyyy-MM-dd HH:mm:ss");

私はあなたがこのようにそれを行うことができることも学びました:

DateTime myDateTime = DateTime.Now;
string sqlFormattedDate = myDateTime.ToString(myCountryDateFormat);

myCountryDateFormatは、要件に応じて変更に合わせて変更できます。

タグ付きの「この質問にはすでにここで回答がある可能性があります:」は、実際には質問に回答していないことに注意してください。.NETの新しいプログラマにとっては、かなり混乱します。


2

現在の日付をテーブルに保存して使用できるようにする場合

GETDATE();

または、この関数をパラメーターとして渡します

例えば。'tblnameを更新set curdate = GETDATE()where colname = 123'



1

あなたの問題は、現在までしかDate切り捨てられDateTimeていないプロパティにあります。あなたはこのように変換を置くことができます:

DateTime myDateTime = DateTime.Now;

string sqlFormattedDate = myDateTime.ToString("yyyy-MM-dd HH:mm:ss");

ありがとう。まさに私が探していたものです;)驚いたマイクロソフトはこれをもっと簡単に行うためのフラグやコマンドを追加しませんでした。
Zeek2

0

SQL Serverの言語設定に関係なく、C#からSQL ServerにDateTimeを渡す別のソリューション

おそらくあなたの地域設定は日付をdd.MM.yyyy(ドイツ標準 '104')として表示します

DateTime myDateTime = DateTime.Now;
string sqlServerDate ="CONVERT("date,'"+myDateTime+"',104)"; 

C#のdatetime変数をSQL ServerのDate型変数に渡します。 "104"ルールによるマッピングを考慮しています。SQL Serverの日付はyyyy-MM-ddになります

地域の設定でDateTimeの表示が異なる場合は、SQL Server CONVERTテーブルの適切なマッチングを使用します

ルールの詳細:https : //www.techonthenet.com/sql_server/functions/convert.php


0

問題は、2つの単一引用符が欠落していたことだと思います。

これは、MSSMSに対して実行するSQLです。

WHERE checktime >= '2019-01-24 15:01:36.000' AND checktime <= '2019-01-25 16:01:36.000'

ご覧のとおり、2つの単一引用符があるため、コードは次のようにする必要があります。

string sqlFormattedDate = "'" + myDateTime.Date.ToString("yyyy-MM-dd") + " " + myDateTime.TimeOfDay.ToString("HH:mm:ss") + "'";

MSSQLまたはMySQLのすべての文字列に単一引用符を使用します。これがお役に立てば幸いです。


0

組み込みのSqlDateTimeクラスを使用しましょう

new SqlDateTime(DateTime.Now).ToSqlString()

ただし、依然としてnull値を確認する必要があります。これはオーバーフロー例外をスローします

new SqlDateTime(DateTime.MinValue).ToSqlString()

SqlDateTime overflow. Must be between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM.



-1

そのdateTimeでテーブルを更新する場合は、次の例のようにSQL文字列を使用できます。

int fieldId;
DateTime myDateTime = DateTime.Now
string sql = string.Format(@"UPDATE TableName SET DateFieldName='{0}' WHERE FieldID={1}, myDateTime.ToString("yyyy-MM-dd HH:mm:ss"), fieldId.ToString());

2
この質問は、よりエレガントなソリューションですでに回答され、受け入れられています。そして、あなたはクロージングを逃しています"
1

-1
   DateTime date1 = new DateTime();

    date1 = Convert.ToDateTime(TextBox1.Text);
    Label1.Text = (date1.ToLongTimeString()); //11:00 AM
    Label2.Text = date1.ToLongDateString(); //Friday, November 1, 2019;
    Label3.Text = date1.ToString();
    Label4.Text = date1.ToShortDateString();
    Label5.Text = date1.ToShortTimeString();
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.