C # kullanarak SQL biçimine DateTime biçimi


111

Şu anki tarih saat biçimini C # 'dan kaydetmeye ve bunu bir SQL Server tarih biçimine dönüştürmeye çalışıyorum, böylece yyyy-MM-dd HH:mm:ssonu UPDATEsorgum için kullanabilirim .

Bu benim ilk kodumdu:

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

Tarihte çıktı yeterli, ancak saat her zaman "12:00:00" olduğundan kodumu şu şekilde değiştirdim:

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

Bana şu derleme hatasını verdi:

FormatException işlenmedi

Ve ayrıştırmam gerektiğini önerdi. Bu yüzden StackOverflow'daki araştırmama göre bunu koduma yapmayı denedim:

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

veya

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

Ama bana bunun verilen bağlam için geçerli olmayan bir yöntem olduğunu söylüyor. Sorunuma çözüm aramaya çalıştım ve iki saattir takılı kaldım. C # konusunda hala biraz yeniyim, lütfen bana yardım edebilir misin?


DateTime. TryParseExact'a baktınız mı?
Tim


3
Neden güncellemek için bir parametre kullanmıyorsunuz DateTimeveya bir dizge olarak depoluyorsunuz? Ayrıca ToStringaçık Date, zamanın her zaman olduğu anlamına gelir12:00:00
V4Vendetta

3
Parametre türünde bir parametreleştirilmiş sorgu kullanmalısınız DATETIMEve daha sonra tüm bunları bir dizgi temsiline ve temsilinden ileri geri dönüştürme yapmaktan kaçınabilirsiniz!
marc_s

5
Diğerlerinin de söylediği gibi, parametreleri kullanmak ve her şeyi olduğu gibi tutmak datetimeiyi bir başlangıç ​​olabilir. Daha da iyisi, sunucuyu neden geçerli saati geçiriyorsunuz - GETDATE()tamamen sunucu tarafında çağrılabilen bir işlevi vardır.
Damien_The_Unbeliever

Yanıtlar:


220

bunu aşağıda dene

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

çok teşekkür ederim string sqlFormattedDate = myDateTime.DateTime ... nedense başarmak istediğim şey bu.
Ace Caserya

Stackoverflow'daki araştırmam, soru birkaç kez yanıtlanmış olmasına rağmen beni yanlış bir referansa yönlendirmeye devam ediyor, benim gibi yeni başlayanlar bu yüzden ilişki kuramıyor. Herkese özür dilerim, mümkün olan en kısa sürede soruyu kapatacağım.
Ace Caserya

1
C # "Sıralanabilir" biçiminin de aynı şeyi yaptığını düşünüyorum. Yani sadece myDateTime.ToString ("s") yapabilirsiniz;
ProVega

@ProVega aynı görünmüyor (.ToString ('s') tarih ve saat arasında bir boşluk yerine bir T'ye sahip) - ancak T ile veya T olmadan SQL sunucusu tarafından aynı şekilde ayrıştırıldıklarını doğrulayabilirim ( Ben 2012'deyim). Günlük tarih-saat biçimim olarak 's' kullanmaya başladım, bu yüzden bununla devam edeceğim, teşekkürler!
Ian Grainger

1
Evet, resmi sayfada CAST ve CONVERT (Transact-SQL) , yyyy-MM-ddgünün saatinden ayrı bir boşlukla form için "ODBC kanonik" adını ve ayıran karakterin olduğu form için "ISO8601" adını kullanıyorlar a T. Ancak evet, her iki form da örtük olarak (ve doğru bir şekilde) bir datetime.
Jeppe Stig Nielsen

45

Standart tarih-saat biçiminin kullanılması "s" aynı zamanda uluslararasılaştırma uyumluluğunu da sağlayacaktır (MM / gg'ye karşı gg / MM):

myDateTime.ToString("s");

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

Eksiksiz Seçenekler: (kod: örnek sonuç)

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'te desteklenir: 4.6, 4.5, 4, 3.5, 3.0, 2.0, 1.1, 1.0
Referans: DateTime.ToStringYöntem


2
Bu yeterince ayrıntılı değildir (milisaniyeleri kaçırır) ve tarihe göre siparişe dayanan sorgularda başınızı belaya sokar.
reijerh

Saat ve dakikaları da almak için şu dönüşümü kullanabilirsiniz: string sqlFormattedDate = YourDate.ToString ("yyyy-MM-ddTHH: mm: ss", System.Globalization.CultureInfo.InvariantCulture);
2019

myDateTime.ToString("o");Bunun yerine kullanın , milisaniyeleri vardır ve tam anlamıyla belgelerde "Gidiş-dönüş tarih / saat kalıbı" olarak tanımlanmıştır. "s"yalnızca "Sıralanabilir tarih / saat kalıbı" olarak tanımlandığından, bunun için kullanılmasını önermem. Bakınız: docs.microsoft.com/en-us/dotnet/standard/base-types/…
Deantwo

9

Doğru cevaba zaten "kullanım parametreleri" verildi. Bir tarihin biçimlendirilmesi ve SQL-Server'a bir dizge olarak geçirilmesi, tarihin sunucu tarafında nasıl yorumlandığına bağlı olduğu için hatalara yol açabilir. Avrupa'da, 1 Aralık 2012'yi belirtmek için '1.12.2012' yazarken, diğer ülkelerde bu 12 Ocak olarak değerlendirilebilir.

Doğrudan SSMS'de ifadeler yayınlarken yyyymmddoldukça genel görünen formatı kullanıyorum . Şu ana kadar üzerinde çalıştığım çeşitli kurulumlarda herhangi bir sorunla karşılaşmadım.

Nadiren kullanılan başka bir format daha var, bu biraz garip ama tüm sürümler için çalışıyor:

select { d '2013-10-01' }

ilk ekim 2013'te geri dönecek.

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

1 Ekim, 13:45:01 geri dönecek

Parametreleri kullanmanızı ve kendi SQL kodunuzu hiçbir zaman kendi oluşturduğunuz formatlı ifade parçalarını birbirine yapıştırarak formatlamanızı şiddetle tavsiye ederim . SQL enjeksiyonu ve garip hatalar için bir giriştir (bir kayan değerin biçimlendirilmesi başka bir olası sorundur)


3

İlk kodunuz bunu yaparak çalışacaktır

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

3

Sorununuz DateTimeyalnızca bugüne kadar kesilen "Tarih" özelliğinde . Dönüşümü şu şekilde koyabilirsiniz:

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

3

mevcut tarihi tabloya kaydetmek istiyorsanız,

GETDATE ();

veya bu işlevi parametre olarak iletin

Örneğin. 'tblname setini güncelle curdate = GETDATE (), colname = 123'


SQL tablosunda varsayılan değer olarak daha da iyi çalışır. Varsayılan değerlerin kullanımına izin vermeyen bir çerçeve kullanmadığınız sürece.
Deantwo

2

Aradığım cevap şuydu:

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

Bunu şu şekilde yapabileceğinizi de öğrendim:

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

myCountryDateFormat, gereksinime bağlı olarak değişikliği karşılamak için değiştirilebilir.

Lütfen "Bu sorunun burada zaten bir cevabı olabilir:" etiketinin soruyu gerçekten yanıtlamadığını unutmayın çünkü sizin de görebileceğiniz gibi onu atlamak yerine ".Date" kullanmıştır. Yeni .NET programcıları için oldukça kafa karıştırıcı


1

Neden dizeyi tamamen atlamıyorsunuz:

SqlDateTime myDateTime = DateTime.Now;

1

Sorununuz yalnızca bugüne kadar Datekesilen mülkte DateTime. Dönüşümü şu şekilde koyabilirsiniz:

DateTime myDateTime = DateTime.Now;

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

Teşekkürler. Tam aradığım şey;) Şaşıran Microsoft, bunu daha kısaca yapmak için bir bayrak veya komut eklemedi.
Zeek2

1

Yerleşik SqlDateTime sınıfını kullanalım

new SqlDateTime(DateTime.Now).ToSqlString()

Ancak yine de boş değerleri kontrol etmeniz gerekiyor. Bu taşma istisnası atacak

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.


0

Sanırım sorun, eksik olan iki alıntıydı.

Bu MSSMS'de çalıştırdığım sql:

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

Gördüğünüz gibi iki tek tırnak vardır, bu nedenle kodlarınız şöyle olmalıdır:

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

MSSQL'deki ve hatta MySQL'deki her dizge için tek tırnak kullanın. Umarım bu yardımcı olur.



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

-1

Bu DateTime ile bir tabloyu güncellemek istiyorsanız, SQL dizenizi aşağıdaki örnekte olduğu gibi kullanabilirsiniz:

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

3
Bu soru daha şık bir çözümle zaten cevaplanmış ve kabul edilmiştir. Ve bir kapanışı kaçırıyorsun ".
Ocak

-1

SQL Server dil ayarlarından bağımsız olarak DateTime'ı C #'dan SQL Server'a geçirmek için başka bir çözüm

Bölgesel Ayarlarınızın tarihi gg.MM.yyyy (Alman standardı '104') olarak gösterdiği varsayılırsa

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

"104" kurallarına göre eşlemeyi dikkate alarak C # datetime değişkenini SQL Server Tarih türü değişkenine geçirir. Sql Server tarihi yyyy-MM-dd alır

Bölgesel Ayarlarınız DateTime'ı farklı gösteriyorsa, SQL Server CONVERT Tablosundan uygun eşleşmeyi kullanın

Kurallar hakkında daha fazlasını görün: https://www.techonthenet.com/sql_server/functions/convert.php


Bu, yalnızca ToString()kültür ayarına özgü olan DateTime'ı çağırır . Bu SQL komutunu gönderen makine SQL sunucusundan başka bir kültür ayarı kullanıyorsa, SQL sunucusu bunu başka bir şeyle karıştırabilir. Bunu yapma! Bakınız: docs.microsoft.com/en-us/dotnet/api/…
Deantwo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.