Format daty i godziny na format SQL przy użyciu języka C #


111

Próbuję zapisać bieżący format daty i godziny z C # i przekonwertować go na format daty programu SQL Server, tak yyyy-MM-dd HH:mm:ssaby można było go użyć do UPDATEzapytania.

To był mój pierwszy kod:

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

Data wyjściowa jest w porządku, ale czas zawsze wynosi „12:00:00”, więc zmieniłem kod na następujący:

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

Dał mi ten błąd kompilacji:

FormatException nie został obsłużony

I zasugerował, że muszę przeanalizować. Więc próbowałem zrobić to z moim kodem, zgodnie z moimi badaniami tutaj w StackOverflow:

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

lub

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

Ale mówi mi, że jest to metoda, która nie jest odpowiednia dla danego kontekstu. Próbowałem poszukać rozwiązania swojego problemu i utknąłem już od dwóch godzin. Wciąż jestem trochę nowy w C #, czy możesz mi pomóc?


Czy spojrzałeś na DateTime.TryParseExact?
Tim


3
Dlaczego nie użyć parametru do aktualizacji, DateTimeczy też przechowujesz go jako ciąg? Również ToStringwłączenie Dateoznaczałoby, że zawsze jest czas12:00:00
V4Vendetta

3
Powinieneś użyć sparametryzowanego zapytania z parametrem typu, DATETIMEa następnie możesz uniknąć wykonywania całej tej konwersji w przód iw tył do iz reprezentacji łańcuchowej!
marc_s

5
Jak powiedzieli inni, używanie parametrów i utrzymywanie wszystkiego jako a datetimebyłoby dobrym początkiem. Jeszcze lepiej, dlaczego podajesz serwerowi aktualny czas - ma GETDATE()funkcję, którą można wywołać całkowicie po stronie serwera.
Damien_The_Unbeliever

Odpowiedzi:


220

spróbuj tego poniżej

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

dziękuję bardzo Próbowałem string sqlFormattedDate = myDateTime.DateTime ... z jakiegoś powodu to jest to, co chcę osiągnąć.
Ace Caserya

Moje wyszukiwanie w stackoverflow odsyła mnie do złego odniesienia, chociaż odpowiedź na to pytanie była kilkakrotnie, dlatego nowicjusze tacy jak ja nie mogą się odnieść z tego powodu. Przepraszam wszystkich, zamknę pytanie, gdy tylko będę mógł.
Ace Caserya,

1
Myślę, że format C # „Sortable” robi to samo. Możesz więc po prostu zrobić myDateTime.ToString ("s");
ProVega

@ProVega nie wygląda tak samo (.ToString ('s') ma T zamiast spacji między datą i godziną) - ale mogę potwierdzić, że są one analizowane tak samo przez serwer SQL z lub bez T ( Jestem na 2012). Zacząłem używać „s” jako formatu daty i godziny rejestrowania, więc myślę, że pójdę z tym, dzięki!
Ian Grainger

1
Tak, na oficjalnej stronie CAST i CONVERT (Transact-SQL) używają nazwy „ODBC canonical” dla formularza ze spacją oddzielającą yyyy-MM-ddod pory dnia i nazwy „ISO8601” dla formularza, w którym separatorem jest znak a T. Ale tak, obie formy konwertują niejawnie (i poprawnie) na plik datetime.
Jeppe Stig Nielsen

45

Użycie standardowego formatu daty i godziny „s” zapewni również zgodność z internacjonalizacją (MM / dd kontra dd / MM):

myDateTime.ToString("s");

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

Pełne opcje: (kod: przykładowy wynik)

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

Obsługiwane w .NET Framework: 4.6, 4.5, 4, 3.5, 3.0, 2.0, 1.1, 1.0
Odwołanie: DateTime.ToStringmetoda


2
Nie jest to wystarczająco szczegółowe (pomija milisekundy) i może sprawić, że będziesz mieć kłopoty z zapytaniami, które polegają na sortowaniu według daty.
reijerh

Aby uzyskać również godziny i minuty, możesz użyć tej konwersji: string sqlFormattedDate = YourDate.ToString ("rrrr-MM-ddTHH: mm: ss", System.Globalization.CultureInfo.InvariantCulture);
netfed

Użyj myDateTime.ToString("o");zamiast tego, ma milisekundy i jest dosłownie opisywany jako „Wzorzec daty / godziny w obie strony” w dokumentacji. "s"jest opisana tylko jako „Sortowalny wzorzec daty / czasu”, więc nie sugerowałbym używania go do tego. Zobacz: docs.microsoft.com/en-us/dotnet/standard/base-types/…
Deantwo

9

Prawidłowa odpowiedź została już podana „użyj parametrów”. Sformatowanie daty i przekazanie jej jako ciągu do SQL-Server może prowadzić do błędów, ponieważ zależy od ustawień interpretacji daty po stronie serwera. W Europie piszemy „1.12.2012”, aby wskazać 1 grudnia 2012 r., Podczas gdy w innych krajach można to traktować jako 12 stycznia.

Wydając wyciągi bezpośrednio w SSMS używam formatu, yyyymmddktóry wydaje się dość ogólny. Nie napotkałem żadnych problemów na różnych instalacjach, nad którymi do tej pory pracowałem.

Istnieje inny rzadko używany format, który jest nieco dziwny, ale działa we wszystkich wersjach:

select { d '2013-10-01' }

zwróci pierwszego października 2013.

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

powróci 1 października, 13:45:01

Zdecydowanie radzę używać parametrów i nigdy nie formatować własnego kodu SQL przez wklejanie razem utworzonych przez siebie sformatowanych fragmentów instrukcji. Jest to wpis dotyczący wstrzyknięcia SQL i dziwnych błędów (formatowanie wartości zmiennoprzecinkowej to kolejny potencjalny problem)


3

W ten sposób zadziała Twój pierwszy kod

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

3

Twój problem tkwi we właściwości „Data”, która skraca DateTimetylko do daty. Możesz umieścić konwersję w następujący sposób:

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

3

jeśli chcesz przechowywać aktualną datę w tabeli, aby móc użyć

GETDATE ();

lub przekaż tę funkcję jako parametr

na przykład. 'update tblname set curdate = GETDATE () where colname = 123'


Działa jeszcze lepiej jako wartość domyślna w tabeli SQL. Chyba że używasz struktury, która nie pozwala na użycie wartości domyślnych.
Deantwo

2

Odpowiedź, której szukałem, brzmiała:

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

Dowiedziałem się też, że możesz to zrobić w ten sposób:

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

gdzie myCountryDateFormat można zmienić, aby dostosować się do zmian w zależności od wymagań.

Zwróć uwagę, że oznaczony tagiem „To pytanie może już mieć tutaj odpowiedź:” w rzeczywistości nie odpowiedział na pytanie, ponieważ, jak widać, zamiast go pominąć, użyto „.Date”. Jest to dość mylące dla nowych programistów .NET


1

Dlaczego nie pominąć całego ciągu:

SqlDateTime myDateTime = DateTime.Now;

1

Twój problem tkwi w Datenieruchomości, która ogranicza DateTimesię tylko do tej pory. Możesz umieścić konwersję w następujący sposób:

DateTime myDateTime = DateTime.Now;

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

Dzięki. Właśnie tego szukałem;) Zaskoczony Microsoft nie dodał flagi ani polecenia, aby zrobić to krócej.
Zeek2

1

Użyjmy wbudowanej klasy SqlDateTime

new SqlDateTime(DateTime.Now).ToSqlString()

Ale nadal trzeba sprawdzać wartości null. Spowoduje to zgłoszenie wyjątku przepełnienia

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

Kolejne rozwiązanie do przekazywania DateTime z C # do SQL Server, niezależnie od ustawień języka SQL Server

przypuszczalnie w ustawieniach regionalnych data jest wyświetlana jako dd.MM.yyyy (norma niemiecka „104”)

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

przekazuje zmienną datetime języka C # do zmiennej typu Data programu SQL Server, biorąc pod uwagę mapowanie zgodnie z regułami „104”. Data serwera SQL to rrrr-MM-dd

Jeśli ustawienia regionalne wyświetlają datę i godzinę inaczej, użyj odpowiedniego dopasowania z tabeli CONVERT programu SQL Server

zobacz więcej o Regułach: https://www.techonthenet.com/sql_server/functions/convert.php


0

Myślę, że problem polegał na braku dwóch pojedynczych cudzysłowów.

To jest sql, który uruchamiam w MSSMS:

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

Jak widać, istnieją dwa pojedyncze cudzysłowy, więc Twoje kody muszą być:

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

Użyj pojedynczych cudzysłowów dla każdego ciągu znaków w MSSQL, a nawet w MySQL. Mam nadzieję, że to pomoże.



-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

Jeśli chcesz zaktualizować tabelę za pomocą tej daty i godziny, możesz użyć ciągu SQL w następujący sposób:

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
Na to pytanie udzielono już odpowiedzi i zaakceptowano bardziej eleganckie rozwiązanie. I brakuje ci zamknięcia ".
Sty
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.