Формат DateTime у форматі SQL за допомогою C #


111

Я намагаюся зберегти поточний формат часу дати з C # і перетворити його у такий формат дати SQL Server, як так, yyyy-MM-dd HH:mm:ssщоб я міг використовувати його для мого UPDATEзапиту.

Це був мій перший код:

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

Вихід на дату нормальний, але час завжди "12:00:00", тому я змінив код на наступне:

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

Це дало мені цю помилку компіляції:

FormatException не оброблено

І запропонував мені розібратися. Тому я спробував зробити це для свого коду, як показало моє дослідження тут, в StackOverflow:

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

або

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

Але це мені говорить, що це метод, який не відповідає дійсності для даного контексту. Я спробував шукати рішення своєї проблеми, і я застряг уже дві години. Я ще трохи новий у C #, чи можете ви мені допомогти?


Ви подивилися на DateTime.TryParseExact?
Тім


3
Чому б не використовувати параметр для оновлення DateTimeабо ви зберігаєте його як рядок? Також ToStringна Dateувазі, що час завжди є12:00:00
V4Vendetta

3
Ви повинні використовувати параметризований запит з параметром типу, DATETIMEі тоді ви зможете уникнути цього перетворення вперед і назад до та з рядкового представлення!
marc_s

5
Як казали інші, використання параметрів і просто збереження всього як datetimeхороший початок. Ще краще, чому ви передаєте сервер поточний час - він має GETDATE()функцію, яку можна повністю викликати на стороні сервера.
Damien_The_Unbeliever

Відповіді:


219

спробуйте це нижче

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

велике дякую, що я намагався рядок sqlFormattedDate = myDateTime.DateTime ... чомусь це я хочу досягти.
Ейс Казерія

Мій пошук у stackoverflow продовжує посилатись на неправильну посилання, хоча на це питання було дано відповідь кілька разів, такі новачки, як я, не можуть пов'язати через це. Вибачте всі, я закрию це питання, як тільки зможу.
Ейс Кейсерія

1
Я думаю, що формат C # "Sortable" робить те саме. Таким чином, ви можете просто зробити myDateTime.ToString ("s");
ProVega

@ProVega він виглядає не однаково (.ToString ('s') має T замість пробілу між датою та часом), - але я можу підтвердити, що вони аналізували те саме на SQL-сервері з або без T ( Я на 2012 рік). Я почав використовувати "s" як мій формат дати входу в журнал, тому я піду з цим, думаю, дякую!
Ян Грінґер

Так, на офіційній сторінці CAST і CONVERT (Transact-SQL) вони використовують назву "ODBC канонічна" для форми з пробілом, що відокремлюється yyyy-MM-ddвід часу доби, а назву "ISO8601" для форми, де розділовий символ а T. Але так, обидві форми перетворюються неявно (і правильно) в a datetime.
Джеппе Стіг Нільсен

44

Використання стандартного формату дати "s" також забезпечить сумісність з інтернаціоналізацією (MM / dd проти dd / MM):

myDateTime.ToString("s");

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

Повні параметри: (код: зразок результату)

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: 4.6, 4.5, 4, 3.5, 3.0, 2.0, 1.1, 1.0
Довідка: DateTime.ToStringМетод


1
Це недостатньо дрібнозернисто (пропускає мілісекунди), і ви зможете уникнути проблем у запитах, які залежать від замовлення за датою.
reijerh

Щоб отримати також години та хвилини, ви можете використовувати це перетворення: рядок sqlFormattedDate = YourDate.ToString ("yyyy-MM-ddTHH: mm: ss", System.Globalization.CultureInfo.InvariantCulture);
netfed

9

Правильна відповідь вже була дана "параметри використання". Форматування дати та передача її у вигляді рядка на SQL-сервер може призвести до помилок, оскільки це залежить від налаштувань інтерпретації дати на стороні сервера. У Європі ми пишемо "1.12.2012", щоб позначити 1 грудня 2012 року, тоді як в інших країнах це може вважатися 12 січня.

При видачі заяв безпосередньо в SSMS я використовую формат, yyyymmddякий здається досить загальним. На різних установках, над якими я працював, я не стикався з жодними проблемами.

Існує ще один рідко використовуваний формат, який трохи дивний, але працює для всіх версій:

select { d '2013-10-01' }

повернеться першого жовтня 2013 року.

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

повернеться 1 жовтня, 13:45:01

Я настійно раджу використовувати параметри і ніколи не форматувати власний код SQL, скріплюючи разом фрагменти форматованих операторів у домашньому вигляді. Це запис для ін'єкції SQL та дивних помилок (форматування значення float - ще одна потенційна проблема)


3

Ваш перший код буде працювати, виконуючи це

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

3

Ваша проблема полягає у властивості "Дата", яка скорочується DateTimeлише на сьогоднішній день. Ви можете поставити конверсію так:

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

2

Відповідь, яку я шукав:

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

Я також дізнався, що ви можете це зробити так:

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

де myCountryDateFormat можна змінити для задоволення змін залежно від потреби.

Зверніть увагу, що тег "На це запитання вже може бути відповідь тут:" насправді не відповів на це питання, оскільки, як ви бачите, він використовував ".Date", а не опускати його. Це досить заплутано для нових програмістів .NET


2

якщо ви хочете зберегти поточну дату в таблиці, щоб ви могли використовувати її

GETDATE ();

або передають цю функцію як параметр

напр. 'update tblname set curdate = GETDATE (), де colname = 123'


1

Чому б взагалі не пропустити рядок:

SqlDateTime myDateTime = DateTime.Now;

1

Ваша проблема полягає у Dateвласності, яка усіляка DateTimeна сьогоднішній день. Ви можете поставити конверсію так:

DateTime myDateTime = DateTime.Now;

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

Дякую. Тільки те, що я шукав;) Здивований Microsoft не додав прапор чи команду, щоб зробити це коротше.
Zeek2

0

Ще одне рішення для передачі DateTime з C # на SQL Server, незалежно від мовних настройок SQL Server

нібито, що Ваші регіональні налаштування показують дату як dd.MM.yyyy (німецький стандарт '104')

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

передає змінну дату C # дату змінною типу дати SQL Server, враховуючи відображення відповідно до правил "104". Дата сервера Sql отримує yyyy-MM-dd

Якщо ваші регіональні налаштування відображають DateTime по-іншому, тоді використовуйте відповідне узгодження з таблиці CONVERT SQL Server

докладніше про Правила: https://www.techonthenet.com/sql_server/functions/convert.php


0

Я думаю, що проблема була у відсутності двох одиничних цитат.

Це sql, який я запускаю до MSSMS:

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

Як ви бачите, є дві одиничні лапки, тож ваші коди повинні бути:

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

Використовуйте поодинокі лапки для кожного рядка в MSSQL або навіть у MySQL. Я сподіваюся, що це допомагає.


0

Давайте скористаємось вбудованим класом SqlDateTime

new SqlDateTime(DateTime.Now).ToSqlString()

Але все ж потрібно перевірити нульові значення. Це призведе до виключення переповнення

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

Якщо ви хочете оновити таблицю з цим dateTime, ви можете використовувати рядок sql, як у цьому прикладі:

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
На це питання вже відповіли та прийняли більш елегантне рішення. І вам не вистачає закриття ".
січня

-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();
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.