web-dev-qa-db-ja.com

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

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

これが私の最初のコードです。

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

Dateの出力は問題ありませんが、時間は常に "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#の少し新しいです、あなたは私を喜ばせますか?

88
Ace Caserya

以下で試してください

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

標準の日時フォーマット "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メソッド

38
InActive

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

SSMSで直接ステートメントを発行するとき、私はフォーマットyyyymmddを使います。私が今まで取り組んできたさまざまなインストールでは、何の問題も発生しませんでした。

あまり使用されない形式もありますが、これは少し変ですが、すべてのバージョンで機能します。

select { d '2013-10-01' }

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

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

10月1日午後1時45分01秒に戻ります

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

6
alzaimar

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

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

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

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

私が探していた答えは:

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
Ace Caserya

文字列を完全にスキップしないのはなぜでしょうか。

SqlDateTime myDateTime = DateTime.Now;
1
Steve D

SQL Serverの言語設定に関係なく、C#からSQL ServerにDateTimeを渡すもう1つの解決策

あなたの地域設定がdd.MM.yyyy(ドイツの標準 '104')として日付を表示しているとします。

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

"104"規則に従ってマッピングを考慮して、C#datetime変数をSQL ServerのDate型変数に渡します。 SQL Serverの日付がyyyy-MM-ddになる

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

規則の詳細を参照してください: https://www.techonthenet.com/sql_server/functions/convert.php

0
George

あなたが使うことができるようにあなたがテーブルに現在の日付を保存したいならば

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

例えば。 '' update table_name set curdate = GETDATE()、colname = 123 '

0
Manohar Patil

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

DateTime myDateTime = DateTime.Now;

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

問題は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