Преобразование varchar dd/mm/yyyy hh:mm:ss в datetime2

У меня есть столбец дат в формате varchar (50), записанный как «дд/мм/гггг», мне нужно преобразовать его в формат datetime2, однако, когда он запускается, он предполагает, что формат «мм/дд/гггг» и преобразуется соответственно, выдает ошибку, когда поле дня превышает 12. Как мне заставить его правильно извлекать данные?

e.g.

03/04/2017 00:00:00
03/04/2017 00:00:00
15/06/2017 00:00:00
15/06/2017 00:00:00
17/05/2017 00:00:00

с последними 3 ошибками броска.

Текущая команда:

select case when try_convert(datetime2,[Date]) is not null
    then cast([Date]as datetime2)
    else null
    end, [Date]
from [Source1]

Результаты:

2017-03-04 00:00:00.0000000  03/04/2017 00:00:00
2017-03-04 00:00:00.0000000  03/04/2017 00:00:00
NULL                         15/06/2017 00:00:00
NULL                         15/06/2017 00:00:00
NULL                         17/05/2017 00:00:00

person Kron    schedule 24.07.2018    source источник
comment
Источник ваших проблем: у меня есть столбец дат в varchar(50) .   -  person Zohar Peled    schedule 24.07.2018
comment
Вы уверены, что это dd/mm, а не mm/dd? А 04/07? Единственное решение — заменить этот столбец соответствующим типом даты. В противном случае вам всегда придется иметь дело с ошибками преобразования или, что еще хуже, с неправильными датами.   -  person Panagiotis Kanavos    schedule 24.07.2018
comment
Хуже ошибки на производстве могут быть только неверные данные о производстве...   -  person Zohar Peled    schedule 24.07.2018


Ответы (3)


Попробуйте это вместо этого:

WITH VTE AS (
    SELECT *
    FROM  (VALUES ('03/04/2017 00:00:00'),
                  ('03/04/2017 00:00:00'),
                  ('15/06/2017 00:00:00'),
                  ('15/06/2017 00:00:00'),
                  ('17/05/2017 00:00:00')) V(StringDatetime))
SELECT *,
       TRY_CONVERT(datetime2(0), VTE.StringDatetime, 103) AS NonStringDatetime2
FROM VTE;

Вы можете найти список кодов стилей в документации: Стили даты и времени

person Larnu    schedule 24.07.2018

convert(datetime, @dt, 103)

Проверьте результаты для всех предоставленных вами значений.

declare @dt varchar(50)='15/06/2017 00:00:00'
set @dt='03/04/2017 00:00:00'
select convert(datetime, @dt, 103)
set @dt='03/04/2017 00:00:00'
select convert(datetime, @dt, 103)
set @dt='15/06/2017 00:00:00'
select convert(datetime, @dt, 103)
set @dt='15/06/2017 00:00:00'
select convert(datetime, @dt, 103)
set @dt='17/05/2017 00:00:00'
select convert(datetime, @dt, 103)
person maulik kansara    schedule 24.07.2018

Это проблема DateFormat. Вы можете легко судить, что когда Month равен 15, это дает ошибку.

declare @st as varchar(50)='15/06/2017 00:00:00'
select Convert(DateTime2,@ST,103)

вы можете использовать приведенный выше код

person Deepak Kumar    schedule 24.07.2018