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:ss
aby można było go użyć do UPDATE
zapytania.
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?
DateTime
czy też przechowujesz go jako ciąg? RównieżToString
włączenieDate
oznaczałoby, że zawsze jest czas12:00:00
DATETIME
a następnie możesz uniknąć wykonywania całej tej konwersji w przód iw tył do iz reprezentacji łańcuchowej!datetime
byłoby dobrym początkiem. Jeszcze lepiej, dlaczego podajesz serwerowi aktualny czas - maGETDATE()
funkcję, którą można wywołać całkowicie po stronie serwera.Odpowiedzi:
spróbuj tego poniżej
źródło
yyyy-MM-dd
od pory dnia i nazwy „ISO8601” dla formularza, w którym separatorem jest znak aT
. Ale tak, obie formy konwertują niejawnie (i poprawnie) na plikdatetime
.Użycie standardowego formatu daty i godziny „s” zapewni również zgodność z internacjonalizacją (MM / dd kontra dd / MM):
Pełne opcje: (kod: przykładowy wynik)
Obsługiwane w .NET Framework: 4.6, 4.5, 4, 3.5, 3.0, 2.0, 1.1, 1.0
Odwołanie:
DateTime.ToString
metodaźródło
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/…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,
yyyymmdd
któ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:
zwróci pierwszego października 2013.
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)
źródło
W ten sposób zadziała Twój pierwszy kod
źródło
Twój problem tkwi we właściwości „Data”, która skraca
DateTime
tylko do daty. Możesz umieścić konwersję w następujący sposób:źródło
jeśli chcesz przechowywać aktualną datę w tabeli, aby móc użyć
lub przekaż tę funkcję jako parametr
na przykład. 'update tblname set curdate = GETDATE () where colname = 123'
źródło
Odpowiedź, której szukałem, brzmiała:
Dowiedziałem się też, że możesz to zrobić w ten sposób:
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
źródło
Dlaczego nie pominąć całego ciągu:
źródło
Twój problem tkwi w
Date
nieruchomości, która ograniczaDateTime
się tylko do tej pory. Możesz umieścić konwersję w następujący sposób:źródło
Użyjmy wbudowanej klasy SqlDateTime
Ale nadal trzeba sprawdzać wartości null. Spowoduje to zgłoszenie wyjątku przepełnienia
SqlDateTime overflow. Must be between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM.
źródło
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”)
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
źródło
Myślę, że problem polegał na braku dwóch pojedynczych cudzysłowów.
To jest sql, który uruchamiam w MSSMS:
Jak widać, istnieją dwa pojedyncze cudzysłowy, więc Twoje kody muszą być:
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.
źródło
tylko umieścisz „T” + DateTime.Now.ToLongTimeString () + „2015-02-23”
źródło
źródło
Jeśli chcesz zaktualizować tabelę za pomocą tej daty i godziny, możesz użyć ciągu SQL w następujący sposób:
źródło
"
.