Формат 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?
Тим
stackoverflow.com/questions/2191120/…
Камил Будзевски 02
3
Почему бы не использовать параметр для обновления DateTimeили вы сохраняете его как строку? Также ToStringнаDate подразумевало бы , что время всегда12:00:00
V4Vendetta
3
Вы должны использовать параметризованный запрос с параметром типа, DATETIMEи тогда вы можете избежать всех этих преобразований назад и вперед в строковое представление и обратно!
marc_s
5
Как говорили другие, использование параметров и простое сохранение всего, как было, datetimeбыло бы хорошим началом. Еще лучше, почему вы передаете серверу текущее время - у него есть GETDATE()функция, которая может быть вызвана полностью на стороне сервера.
Damien_The_Unbeliever 02

Ответы:

220

попробуйте это ниже

DateTime myDateTime = DateTime.Now;
string sqlFormattedDate = myDateTime.ToString("yyyy-MM-dd HH:mm:ss.fff");
Дебаджит Мухопадхьяй
источник
Большое спасибо, я пробовал строку sqlFormattedDate = myDateTime.DateTime ... по какой-то причине это то, чего я хочу достичь.
Ace Caserya 02
Мой поиск в stackoverflow продолжает отсылать меня к неправильной ссылке, хотя на вопрос был дан ответ несколько раз, новички, такие как я, не могут понять из-за этого. Извините всех, я закрою вопрос, как только смогу.
Ace Caserya 02
1
Я думаю, что формат C # "Sortable" делает то же самое. Итак, вы можете просто выполнить myDateTime.ToString ("s");
ProVega
@ProVega это не выглядит одинаково (.ToString ('s') имеет T вместо пробела между датой и временем), но я могу подтвердить, что они анализируются SQL-сервером одинаково с или без T ( Я на 2012 год). Я начал использовать 's' в качестве формата даты и времени для ведения журнала, так что, думаю, я буду придерживаться этого, спасибо!
Ян Грейнджер,
1
Да, на официальной странице CAST и CONVERT (Transact-SQL) они используют имя «ODBC canonical» для формы с пробелом, отделенным yyyy-MM-ddот времени суток, и имя «ISO8601» для формы, где разделительный символ а T. Но да, обе формы неявно (и правильно) конвертируются в datetime.
Jeppe Stig Nielsen
45

Использование стандартного формата даты и времени «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метод

Неактивный
источник
2
Это недостаточно детализировано (пропускаются миллисекунды), и вы столкнетесь с проблемами при запросах, основанных на упорядочении по дате.
Reijerh
Чтобы получить часы и минуты, вы можете использовать это преобразование: string sqlFormattedDate = YourDate.ToString ("yyyy-MM-ddTHH: mm: ss", System.Globalization.CultureInfo.InvariantCulture);
netfed
Используйте myDateTime.ToString("o");вместо этого миллисекунды и буквально описываются в документации как «Круговой шаблон даты / времени». "s"описывается только как «Сортируемый шаблон даты и времени», поэтому я бы не предлагал использовать его для этого. См .: docs.microsoft.com/en-us/dotnet/standard/base-types/…
Deantwo
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-инъекций и странных ошибок (форматирование значения с плавающей запятой - еще одна потенциальная проблема)

Alzaimar
источник
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()!
Дмитрий Быченко
источник
3

если вы хотите сохранить текущую дату в таблице, чтобы вы могли использовать

GETDATE ();

или передайте эту функцию как параметр

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

Манохар Патил
источник
Он работает даже лучше в качестве значения по умолчанию в таблице SQL. Если только вы не используете фреймворк, который не позволяет использовать значения по умолчанию.
Deantwo
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 можно изменить в соответствии с требованиями.

Обратите внимание, что на этот вопрос с пометкой «Возможно, здесь уже есть ответ», на самом деле нет ответа на этот вопрос, потому что, как вы можете видеть, вместо его пропуска используется «.Дата». Это довольно сбивает с толку начинающих программистов .NET.

Эйс Казерья
источник
1

Почему бы вообще не пропустить строку:

SqlDateTime myDateTime = DateTime.Now;
Стив Д
источник
1

Ваша проблема в том, Dateчто усекается DateTimeтолько свойство . Вы могли бы преобразовать так:

DateTime myDateTime = DateTime.Now;

string sqlFormattedDate = myDateTime.ToString("yyyy-MM-dd HH:mm:ss");
Nanthakumar
источник
Спасибо. Именно то, что я искал;) Удивленная Microsoft не добавила флаг или команду, чтобы сделать это более кратко.
Zeek2,
1

Воспользуемся встроенным классом 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.

мкб
источник
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. Надеюсь, это поможет.

Джошуа Дави Абеджеро
источник
-1

только вы помещаете "T" + DateTime.Now.ToLongTimeString () + '2015-02-23'

Франсиско Миер Итеран
источник
сначала дата XD date + "T" + DateTime.Now.ToLongTimeString ()
Франсиско Майер ЙТеран
-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

Если вы хотите обновить таблицу с помощью этого 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());
Родриго Узчанга
источник
3
На этот вопрос уже дан ответ и принято более элегантное решение. И вам не хватает закрытия ".
Jan
-1

Другое решение для передачи DateTime с C # на SQL Server, независимо от языковых настроек SQL Server.

предположительно, что ваши региональные настройки показывают дату как dd.MM.yyyy (немецкий стандарт '104'), тогда

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

передает переменную datetime C # в переменную типа Date в SQL Server с учетом сопоставления согласно правилам «104». Дата сервера sql получает гггг-мм-дд

Если в ваших региональных настройках DateTime отображается иначе, используйте соответствующее соответствие из таблицы преобразований SQL Server.

подробнее о правилах: https://www.techonthenet.com/sql_server/functions/convert.php

Джордж
источник
Это просто вызовет ToString()DateTime, который зависит от настройки культуры. Если машина, отправляющая эту команду SQL, использует другой параметр культуры, чем сервер SQL, сервер SQL может принять его за что-то еще. Не делай этого! См .: docs.microsoft.com/en-us/dotnet/api/…
Deantwo