SQL Server: проблема с преобразованием даты?

#sql #sql-server #tsql #sql-server-2008

#sql #sql-server #tsql #sql-server-2008

Вопрос:

У меня есть столбец, в котором значения даты хранятся в varchar (формат ddmmyy) следующим образом

 231280
121280
131185
...
  

Как преобразовать эти значения в тип данных datetime?

Ответ №1:

 Set DateFormat DMY
GO
Select Cast(Stuff(Stuff(SomeValue, 3, 0, '-'), 6, 0, '-') As datetime)
From MyData
  

Комментарии:

1. Используя это решение, должен ли я всегда устанавливать dateformat в DMY перед выполнением?

2. @jara — Да, потому что это гарантирует, что Cast правильно интерпретирует положение месяца и дня независимо от формата даты по умолчанию на сервере.

3. @jara — Без DateFormat, например, на компьютере / сервере в США, было бы желательно интерпретировать дату как MM-DD-YY вместо DD-MM-YY.

Ответ №2:

Используйте подстроку, чтобы получить год, месяц и день, если год больше 11, добавьте к нему 19, если нет, добавьте 20, чтобы получить год в формате 2009, но это ваш запрос, просто вместо строки добавьте имя вашего столбца

  select CAST(
            CASE WHEN CAST(SUBSTRING('231280', 5, 2) AS INT) >11
                    THEN '19' SUBSTRING('231280', 5, 2) 
                    else '20' SUBSTRING('231280', 5, 2) 
                END 
         '-' SUBSTRING('231280', 3, 2) '-' SUBSTRING('231280', 1, 2) as datetime)
  

Ответ №3:

Вам пришлось бы использовать некоторую обработку подстрок, чтобы преобразовать вашу строку в известный формат даты. Вот пример преобразования строки в формат 3, «британский / французский»:

 declare @YourTable table (YourColumn varchar(50))
insert @YourTable
          select '231280'
union all select '121280'
union all select '131185'

select  convert(datetime, substring(YourColumn,1,2)   '/'   
    substring(YourColumn,3,2)   '/'   substring(YourColumn,5,2), 3)
from    @YourTable
  

Ответ №4:

Поскольку этот формат является нестандартным, используйте

 DECLARE @field char(6)
SET @field = '231280'
select convert(datetime, right(@field, 2)     substring(@field, 3, 2)   left(@field, 2)  , 12)
  

Комментарии:

1. Код построил строки в неправильном порядке, что привело к ошибке, но основная идея была правильной. Я исправил код и протестировал, чтобы убедиться, что он работает.

2. @JohnFx Я отредактировал это через 5 секунд после публикации. Я назвал свою правку «Doh». Затем, 9 минут спустя, вы сделали то же самое : (