Format DateTime ke format SQL menggunakan C #

111

Saya mencoba menyimpan format waktu tanggal saat ini dari C # dan mengubahnya menjadi format tanggal SQL Server yyyy-MM-dd HH:mm:sssehingga saya dapat menggunakannya untuk UPDATEkueri saya .

Ini adalah kode pertama saya:

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

Output pada tanggal baik-baik saja, tetapi waktu selalu "12:00:00" jadi saya mengubah kode saya menjadi berikut:

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

Itu memberi saya kesalahan kompilasi ini:

FormatException tidak ditangani

Dan menyarankan saya perlu mengurai. Jadi saya mencoba melakukan ini ke kode saya sesuai penelitian saya di sini di StackOverflow:

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

atau

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

Tapi itu memberi tahu saya bahwa itu adalah metode yang tidak valid untuk konteks tertentu. Saya mencoba mencari solusi untuk masalah saya dan saya telah terjebak selama dua jam sekarang. Saya masih agak baru di C #, dapatkah Anda membantu saya?

Ace Caserya
sumber
Pernahkah Anda melihat DateTime.TryParseExact?
Tim
3
Mengapa tidak menggunakan parameter untuk memperbarui DateTimeatau Anda menyimpannya sebagai string? Juga ToStringpada Dateakan menyiratkan bahwa waktu selalu12:00:00
V4Vendetta
3
Anda harus menggunakan kueri parametrized dengan parameter tipe DATETIMEdan kemudian Anda dapat menghindari melakukan semua ini mengkonversi bolak-balik ke dan dari representasi string!
marc_s
5
Seperti yang dikatakan orang lain, menggunakan parameter dan menyimpan semuanya sebagai awal datetimeakan menjadi awal yang baik. Lebih baik lagi, mengapa Anda melewati server saat ini - ini memiliki GETDATE()fungsi yang dapat dipanggil sepenuhnya di sisi server.
Damien_The_Unbeliever

Jawaban:

219

coba ini di bawah

DateTime myDateTime = DateTime.Now;
string sqlFormattedDate = myDateTime.ToString("yyyy-MM-dd HH:mm:ss.fff");
Debajit Mukhopadhyay
sumber
terima kasih banyak saya mencoba string sqlFormattedDate = myDateTime.DateTime ... untuk beberapa alasan inilah yang ingin saya capai.
Ace Caserya
Pencarian saya di stackoverflow terus mengarahkan saya ke referensi yang salah meskipun pertanyaannya telah dijawab beberapa kali, pemula seperti saya tidak dapat memahami karena ini. Maaf untuk Semua, saya akan menutup pertanyaan ini segera setelah saya bisa.
Ace Caserya
1
Saya pikir format C # "Sortable" melakukan hal yang sama. Jadi Anda bisa melakukan myDateTime.ToString ("s");
ProVega
@ProVega tidak terlihat sama (.ToString ('s') memiliki T, bukan spasi antara tanggal dan waktu) - tetapi saya dapat mengonfirmasi bahwa mereka diurai sama oleh SQL server dengan atau tanpa T ( Saya di 2012). Saya sudah mulai menggunakan 's' sebagai format waktu pencatatan, jadi saya akan menggunakannya, terima kasih!
Ian Grainger
Ya, di halaman resmi CAST dan CONVERT (Transact-SQL) , mereka menggunakan nama "ODBC canonical" untuk formulir dengan spasi yang dipisahkan yyyy-MM-dddari waktu, dan nama "ISO8601" untuk formulir di mana karakter pemisahnya adalah a T. Tapi ya, kedua bentuk tersebut diubah secara implisit (dan benar) menjadi a datetime.
Jeppe Stig Nielsen
45

Menggunakan format tanggal waktu standar "s" juga akan memastikan kompatibilitas internasionalisasi (MM / dd versus dd / MM):

myDateTime.ToString("s");

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

Opsi Lengkap: (kode: hasil sampel)

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

Didukung di .NET Framework: 4.6, 4.5, 4, 3.5, 3.0, 2.0, 1.1, 1.0
Referensi: DateTime.ToStringMetode

InActive
sumber
1
Ini tidak cukup berbutir halus (meleset dari milidetik) dan akan membuat Anda mendapat masalah dalam kueri yang bergantung pada pengurutan berdasarkan tanggal.
reijerh
Untuk mendapatkan jam dan menit juga, Anda dapat menggunakan konversi ini: string sqlFormattedDate = YourDate.ToString ("yyyy-MM-ddTHH: mm: ss", System.Globalization.CultureInfo.InvariantCulture);
netfed
9

Jawaban yang benar sudah diberikan "gunakan parameter". Memformat tanggal dan meneruskannya sebagai string ke SQL-Server dapat menyebabkan kesalahan karena bergantung pada pengaturan bagaimana tanggal diinterpretasikan di sisi server. Di Eropa, kami menulis '1.12.2012' untuk menunjukkan 1 Desember 2012, sedangkan di negara lain ini mungkin diperlakukan sebagai 12 Januari.

Saat mengeluarkan pernyataan langsung di SSMS saya menggunakan format yyyymmddyang tampaknya cukup umum. Saya tidak menemui masalah pada berbagai instalasi yang saya kerjakan sejauh ini.

Ada format lain yang jarang digunakan, yang agak aneh tetapi berfungsi untuk semua versi:

select { d '2013-10-01' }

akan kembali pada tanggal 1 oktober 2013.

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

akan kembali pada 1 Oktober, 1:45:01

Saya sangat menyarankan untuk menggunakan parameter dan jangan pernah memformat kode SQL Anda sendiri dengan menempelkan fragmen pernyataan berformat homegrown. Ini adalah entri untuk injeksi SQL dan kesalahan aneh (memformat nilai float adalah masalah potensial lainnya)

alzaimar
sumber
3

Kode pertama Anda akan berfungsi dengan melakukan ini

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

Masalah Anda ada di properti "Tanggal" yang dipotong DateTimemenjadi hanya tanggal. Anda bisa membuat konversi seperti ini:

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

Jawaban yang saya cari adalah:

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

Saya juga belajar bahwa Anda dapat melakukannya dengan cara ini:

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

di mana myCountryDateFormat dapat diubah untuk memenuhi perubahan tergantung pada kebutuhan.

Harap perhatikan bahwa tag "Pertanyaan ini mungkin sudah memiliki jawaban di sini:" sebenarnya belum menjawab pertanyaan karena seperti yang Anda lihat menggunakan ".Tanggal", bukan menghilangkannya. Ini cukup membingungkan bagi pemrogram baru .NET

Ace Caserya
sumber
2

jika Anda ingin menyimpan tanggal sekarang dalam tabel sehingga Anda dapat menggunakan

GETDATE ();

atau berikan fungsi ini sebagai parameter

misalnya. 'update tblname set curdate = GETDATE () dimana colname = 123'

Manohar Patil
sumber
1

Mengapa tidak melewatkan string sama sekali:

SqlDateTime myDateTime = DateTime.Now;
Steve D
sumber
1

Masalah Anda ada pada Dateproperti yang terpotong DateTimehingga saat ini saja. Anda bisa membuat konversi seperti ini:

DateTime myDateTime = DateTime.Now;

string sqlFormattedDate = myDateTime.ToString("yyyy-MM-dd HH:mm:ss");
nanthakumar
sumber
Terima kasih. Hanya apa yang saya cari;) Terkejut Microsoft tidak menambahkan bendera atau perintah untuk melakukan ini lebih singkat.
Zeek2
0

Solusi lain untuk meneruskan DateTime dari C # ke SQL Server, terlepas dari pengaturan bahasa SQL Server

seharusnya Pengaturan Regional Anda menunjukkan tanggal sebagai dd.MM.yyyy (standar Jerman '104') lalu

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

meneruskan variabel C # datetime ke variabel tipe SQL Server Date, dengan mempertimbangkan pemetaan sesuai aturan "104". Tanggal Server Sql mendapat tttt-BB-hh

Jika Pengaturan Regional Anda menampilkan DateTime secara berbeda, kemudian gunakan pencocokan yang sesuai dari Tabel CONVERT SQL Server

lihat lebih lanjut tentang Aturan: https://www.techonthenet.com/sql_server/functions/convert.php

George
sumber
0

Saya pikir masalahnya adalah dua kutipan tunggal yang hilang.

Ini adalah sql yang saya jalankan ke MSSMS:

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

Seperti yang Anda lihat, ada dua tanda kutip tunggal, jadi kode Anda harus:

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

Gunakan tanda kutip tunggal untuk setiap string di MSSQL atau bahkan di MySQL. Saya harap ini membantu.

Joshua Dawi Abejero
sumber
0

Mari gunakan kelas SqlDateTime bawaan

new SqlDateTime(DateTime.Now).ToSqlString()

Tapi masih perlu memeriksa nilai null. Ini akan memunculkan pengecualian overflow

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.

mkb
sumber
-1

hanya Anda meletakkan "T" + DateTime.Now.ToLongTimeString () + '2015-02-23'

Francisco Mier YTerán
sumber
pertama tanggal XD tanggal + "T" + DateTime.Now.ToLongTimeString ()
Francisco Mier YTerán
-1

Jika Anda ingin memperbarui tabel dengan dateTime tersebut, Anda dapat menggunakan string sql Anda seperti contoh ini:

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());
Rodrigo Uzcanga
sumber
2
Pertanyaan ini telah dijawab dan diterima dengan solusi yang lebih elegan. Dan Anda melewatkan penutupan ".
Jan
-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();
ahmed adam ahmed abdel rahman
sumber