Как исправить дату и время между C # и SQL Server на разных компьютерах

1

Я создаю приложения для своих клиентов, и я обычно получаю проблему преобразования DateTime когда приложение развертывается на других компьютерах.

В Winforms у меня есть контроль выбора даты для пользователей. Пользователь выбирает дату и кнопку клика, затем я делаю SQL-запрос для SQL Server. Я фильтрую SELECT с выбранной датой. Но я обычно получаю проблему преобразования DateTime на другом компьютере из-за их региональных настроек.

Есть ли способ исправить формат DateTime между С# и SQL Server, иногда SQL Server может находиться на главном сервере, а пользователи используют мое приложение на своем клиентском компьютере. Некоторые серверы SQL принимают 2014-08-20 а некоторые принимают 20-08-2014. Как я могу исправить это время для всех?

Пример кода здесь:

DateTime date_ = DateTime.Today;
.....
.....
sql = "select * from table where order_date="+date_.ToShortDateString();
  • 1
    Вы выполняете sql-запрос из winform, или для чего? Я хотел бы использовать параметрический SQL-запрос - как "выбрать * из таблицы, где order_date = @ order_date".
  • 0
    Используйте параметризованный SQL-запрос. И не только из-за этой проблемы формата DateTime - Google предоставит вам другие более важные причины.
Теги:
sql-server
datetime

3 ответа

2
Лучший ответ

Прежде всего, если ваш столбец order_date является типом datetime, вы не должны передавать ему строковое представление вашего значения DateTime. Вам нужно передать его непосредственно значение DateTime с параметризованными запросами, конечно. Поскольку этот тип конкатенаций строк открыт для атак SQL Injection.

Если ваш столбец order_date имеет тип символа, измените его на DateTime. Символьные типизированные столбцы (varchar, nvarchar и т.д.) nvarchar для символов, столбцы с типом datetime и времени для DateTime.

Нет смысла сохранять DateTime' как string.

Как примечание; в DateTime в С# не имеет никакого неявного формата. Это просто значение, которое содержит кусочек раз. Строковое представление имеет форматы.

2

Существует множество форматов, поддерживаемых SQL Server - см. Электронную книгу MSDN в Интернете по CAST и CONVERT. Большинство из этих форматов зависят от настроек, которые у вас есть, поэтому эти настройки могут работать несколько раз, а иногда и нет.

Способ решения этого вопроса - использовать (слегка адаптированный) формат даты ISO-8601, поддерживаемый SQL Server, - этот формат работает всегда - независимо от ваших языков SQL Server и настроек даты.

Формат ISO-8601 поддерживается SQL Server в двух вариантах:

  • YYYYMMDD только для дат (без временной доли); обратите внимание здесь: никаких тире! , это очень важно! YYYY-MM-DD НЕ является независимым от параметров dateformat на вашем SQL Server и НЕ будет работать во всех ситуациях!

или:

  • YYYY-MM-DDTHH:MM:SS для дат и времени - обратите внимание: этот формат имеет тире (но их можно опустить), а фиксированный T как разделитель между датой и временем вашего DATETIME.

Это справедливо для SQL Server 2000 и новее.

Если вы используете SQL Server 2008 или новее и тип данных DATE (только DATE - не DATETIME !), Тогда вы действительно можете использовать формат YYYY-MM-DD, и это тоже будет работать с любыми настройками на вашем SQL Server.

Не спрашивайте меня, почему эта целая тема настолько сложна и несколько запутанна - так она и есть. Но с форматом YYYYMMDD вы должны быть в порядке для любой версии SQL Server и для любого языка и параметра dateformat на вашем SQL Server.

Рекомендация для SQL Server 2008 и новее - использовать DATE если вам нужна только часть даты, и DATETIME2(n) когда вам нужны как дата, так и время. Вы должны попытаться приступить к поэтапному прекращению использования типа данных DATETIME

Поэтому, если вы должны использовать строковый формат даты - используйте формат ISO-8601, но, как уже упоминал Soner Gönül, при использовании запросов с С#, попробуйте использовать DateTime качестве параметров - не всегда конвертировать все в строку!

0

вы можете просто использовать дату с месяцем в тексте

DateTime date_ = DateTime.Today;
.....
.....
sql = "select * from table where order_date='"+date_.ToString("dd/MMM/yyyy")+"'";

или конвертировать дату в SQL datetime

sql = "select * from table where order_date=CONVERT(DATETIME, '"+date_.ToString("yyyy-MM-dd")+"', 102)";

здесь приведен список функций даты для SQL

select CONVERT(VARCHAR(12),getdate(),100) +' '+ 'Date -100- MMM DD YYYY' -- Feb 5 2010
select CONVERT(VARCHAR(10),getdate(),101) +' '+ 'Date -101- MM/DDYYYY'
select CONVERT(VARCHAR(10),getdate(),102) +' '+ 'Date -102- YYYY.MM.DD'
select CONVERT(VARCHAR(10),getdate(),103) +' '+ 'Date -103- DD/MM/YYYY'
select CONVERT(VARCHAR(10),getdate(),104) +' '+ 'Date -104- DD.MM.YYYY'
select CONVERT(VARCHAR(10),getdate(),105) +' '+ 'Date -105- DD-MM-YYYY'
select CONVERT(VARCHAR(11),getdate(),106) +' '+ 'Date -106- DD MMM YYYY' --ex: 03 Jan 2007
select CONVERT(VARCHAR(12),getdate(),107) +' '+ 'Date -107- MMM DD,YYYY' --ex: Jan 03, 2007
select CONVERT(VARCHAR(12),getdate(),109) +' '+ 'Date -108- MMM DD YYYY' -- Feb 5 2010
select CONVERT(VARCHAR(12),getdate(),110) +' '+ 'Date -110- MM-DD-YYYY' --02-05-2010
select CONVERT(VARCHAR(10),getdate(),111) +' '+ 'Date -111- YYYY/MM/DD'
select CONVERT(VARCHAR(12),getdate(),112) +' '+ 'Date -112- YYYYMMDD' -- 20100205
select CONVERT(VARCHAR(12),getdate(),113) +' '+ 'Date -113- DD MMM YYYY' -- 05 Feb 2010


SELECT convert(varchar, getdate(), 20) -- 2010-02-05 10:25:14
SELECT convert(varchar, getdate(), 23) -- 2010-02-05
SELECT convert(varchar, getdate(), 24) -- 10:24:20
SELECT convert(varchar, getdate(), 25) -- 2010-02-05 10:24:34.913
SELECT convert(varchar, getdate(), 21) -- 2010-02-05 10:25:02.990


---==================================
-- To get the time
select CONVERT(VARCHAR(12),getdate(),108) +' '+ 'Date -108- HH:MM:SS' -- 10:05:53

select CONVERT(VARCHAR(12),getdate(),114) +' '+ 'Date -114- HH:MM:SS:MS' -- 10:09:46:223
SELECT convert(varchar, getdate(), 22) -- 02/05/10 10:23:11 AM

Ещё вопросы

Сообщество Overcoder
Наверх
Меню