使用Cast将varchar转换为日期

时间:2019-10-18 14:44:34

标签: sql sql-server date

我想将一些“日期”转换为实际日期。这似乎在一天少于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 个答案:

答案 0 :(得分:2)

由于日期字符串为DD / MM / YYYY,因此可以使用样式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)

答案 1 :(得分:0)

一种相对简单的方法是将值分为两部分,一部分用于日期,另一部分用于时间部分:

select try_convert(datetime, left(str, 10), 104) + try_convert(datetime, right(str, 5))
from (values ('26/08/2018 22:41')) v(str);

答案 2 :(得分:0)

我认为指定转换日期格式较为安全-查看TRY_CONVERT (Transact-SQL),您可以在其中设置格式(请参见此处的其他格式-CAST and CONVERT (Transact-SQL)。我想目前您的日期被视为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