Преобразование varchar в дату, используя приведение - PullRequest
2 голосов
/ 18 октября 2019

Я хочу преобразовать некоторые "даты" в реальные даты. Кажется, это работает, когда день меньше 13-го. Кажется, он признает 13-е число как месяц.

SELECT [User ID],
       try_CAST([First Seen (BST)] as datetime) as [New First Seen Date]
       [First Seen (BST)],
       [Signed up (BST)]
FROM [dbo].[fix]

Показывается как NULL, когда я ожидал бы преобразовать их в тот же формат / тип.

New First Seen Date                      First Seen Date
2018-11-08 23:38:00.000                  11/08/2018 23:38
NULL                                     20/08/2018 22:07
NULL                                     26/08/2018 22:41
2018-09-09 20:55:00.000                  09/09/2018 20:55
2018-09-09 23:24:00.000                  09/09/2018 23:24

высоко ценится

Ответы [ 3 ]

2 голосов
/ 18 октября 2019

Поскольку ваши строки даты - ДД / ММ / ГГГГ, вы можете использовать стиль 103.

select NewDate = TRY_CONVERT(datetime, s.FirstSeenDate, 103)
    , s.FirstSeenDate
from 
(values
    ('11/08/2018 23:38')
    , ('20/08/2018 22:07')
    , ('26/08/2018 22:41')
    , ('09/09/2018 20:55')
    , ('09/09/2018 23:24')
)s(FirstSeenDate)
0 голосов
/ 18 октября 2019

Я думаю, что немного безопаснее указать формат даты для конвертации - посмотрите TRY_CONVERT (Transact-SQL), где вы можете установить формат (см. Различные форматы здесь - CAST and CONVERT (Transact-SQL). IПредположим, в настоящее время ваши даты обрабатываются как mm/dd/yyyy вместо dd/mm/yyyy, поэтому вы можете использовать формат 103 для их преобразования.

select
    try_convert(datetime, [First Seen Date], 103) as res
from ...

res
-------------------
11/08/2018 23:38:00
20/08/2018 22:07:00
26/08/2018 22:41:00
09/09/2018 20:55:00
09/09/2018 23:24:00

db<>fiddle demo

0 голосов
/ 18 октября 2019

Один относительно простой метод - разбить значения на две части, одну для даты, а другую для временной части:

select try_convert(datetime, left(str, 10), 104) + try_convert(datetime, right(str, 5))
from (values ('26/08/2018 22:41')) v(str);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...