SQL Server - преобразование даты - PullRequest
1 голос
/ 20 апреля 2011

У меня проблема с преобразованием дат в SQL Server 2008

Значение, которое я преобразовываю, выглядит следующим образом: 30-NOV-44 08.00.00.000000000

Результат, который я получаю, выглядит так: 2044-11-30 00:00:00.000

Код, который я использую, выглядит следующим образом:

SELECT TOP 1000 [USER_ID]
      ,CONVERT(datetime,SUBSTRING([DATEOFBIRTH],0,11),112) AS ConvertedDate
      ,[DATEOFBIRTH]
  FROM [IAM_Perf].[dbo].[01_Data]
  WHERE DATEOFBIRTH IS NOT NULL

Какой бы параметр я использовал в функции CONVERT, я возвращаю тот же формат, и многие даты конвертируются в будущее??!

Результаты меняются, когда я переключаюсь между датой и датой в первом аргументе CONVERT, но это не влияет на неверные результаты.

Я использую функцию подстроки, потому что в противном случаеон не преобразует значение и выдает эту ошибку:

Сообщение 241, Уровень 16, Состояние 1, Строка 1 Преобразование не удалось при преобразовании даты и / или времени из строки символов.

Я не уверен, как с этим бороться, я не могу гарантировать, что формат всегда останется прежним, иначе я просто переформатировал бы его вручную, используя некоторый T-SQL

У кого-нибудь есть какие-нибудь идеи?

Спасибо,

Мэтт

Ответы [ 3 ]

3 голосов
/ 20 апреля 2011

Вы можете настроить год среза, используя

EXEC sp_configure 'show advanced options', 1
RECONFIGURE
EXEC sp_configure 'two digit year cutoff', 2011
RECONFIGURE

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

3 голосов
/ 20 апреля 2011

Поскольку будущие даты в SQL Server полностью действительны, система должна использовать эвристику, когда вы передаете ей только двузначную дату. Я полагаю, что по умолчанию эвристика заключается в том, что 0–49 лет приходятся на 21-й век, а 50–99 лет - на 20-й век. Это, однако, настраивается .

Вам необходимо исправить эти данные до того, как они попадут в вашу базу данных, и в любом случае желательно, чтобы DateOfBirth сохранял в столбце datetime (а не в виде строки).


Значение даты и времени не имеет формата - но если вы преобразовали что-то в дату и время, а затем попытаетесь отобразить его, оно всегда будет преобразовано обратно в строку в том же формате (если вы явно не преобразовали его используя CONVERT).

0 голосов
/ 20 апреля 2011

2010/10 / 10_

Преобразование, а затем использование подстроки select *, substring ((convert (varchar (12), hire_date, 121)), 1,10) из сотрудника

или

Это может содержать пробел рядом с датой SUBSTRING ([DATEOFBIRTH], 0,11), 112)

или Попробуйте то же самое с 10 цифрами, преобразование может произойти хорошим SUBSTRING ([DATEOFBIRTH], 0,10), 112)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...