Формат 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 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-инъекций и странных ошибок (форматирование значения с плавающей запятой - еще одна потенциальная проблема)


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

Спасибо. Именно то, что я искал;) Удивленная 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
   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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.