将varchar“ dd / mm / yyyy hh:mm:ss”转换为datetime2

时间:2018-07-24 09:39:04

标签: sql sql-server date datetime2

我有一列varchar(50)格式的日期写为“ dd / mm / yyyy” 我需要将其转换为datetime2格式,但是在运行时会假定该格式为“ mm / dd / yyyy”并进行相应的转换,当day字段超过12时会引发错误。如何使其正确地提取数据方式吗?

例如

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

3 个答案:

答案 0 :(得分: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;

您可以在文档中找到样式代码列表:Date and Time Styles

答案 1 :(得分:1)

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)

答案 2 :(得分:1)

是DateFormat的问题。您可以轻松判断当Month为15时,它给出了错误。

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

您可以使用上面的代码