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?


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");

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


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)


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 

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()!

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


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'


1

Mengapa tidak melewatkan string sama sekali:

SqlDateTime myDateTime = DateTime.Now;

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");

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


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.


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.



-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());

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();
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.