SQL - 将字符串转换为日期和时间

时间:2016-12-20 11:02:16

标签: sql sql-server sql-server-2008 sql-server-2005 sql-server-2008-r2

我需要将值转换为SQL Server DateTime

数据如下所示:

  • 20161021-12:55:16.000
  • 20161021-13:22:09.974

我试过

CONVERT(DATE, '20161021-12:55:16.000', 102) 

它会引发错误。

我可以在SQL中获得帮助,将这些样本转换为有效的日期时间吗?

这些值也是UTC。

我需要将它们转换为EST。

感谢您的帮助。

4 个答案:

答案 0 :(得分:6)

如果您对自己的格式保持一致有信心,那么您可以将其删除(我已将日期时间用于说明目的);

CONVERT(DATETIME, REPLACE('20161021-12:55:16.000','-',' '), 102) 

结果

2016-10-21 12:55:16.000

对于转化,您可以转换为日期时间,取消您的工作时间,然后转换为您想要的日期格式;

CONVERT(DATETIME, DATEADD(hh,-5,CONVERT(DATETIME,REPLACE('20161021-12:55:16.000','-',' '))), 102)

结果;

2016-10-21 07:55:16.000

为了更好地了解这一点,请在凌晨5点之前设置它,然后您将获得前一天;

CONVERT(DATETIME, DATEADD(hh,-5,CONVERT(DATETIME,REPLACE('20161021-04:55:16.000','-',' '))), 102)

结果

2016-10-20 23:55:16.000

作为参考,在我的测试系统上,您不需要转换为102,这是默认设置。

DATEADD(hh,-5,CONVERT(DATETIME,REPLACE('20161021-04:55:16.000','-',' ')))

要动态得到时间差,请执行以下操作;

DATEADD(hh,DATEDIFF(hh,GETUTCDATE(),GETDATE()),CONVERT(DATETIME,REPLACE('20161021-04:55:16.000','-',' ')))

答案 1 :(得分:4)

不需要CONVERT 102.

Select cast(replace('20161021-12:55:16.000','-',' ') as datetime)

返回

2016-10-21 12:55:16.000

从UTC转换为本地服务器。应该记住,时间差将随着夏令时(EDT / EST)而变化

Select DateAdd(MINUTE,DateDiff(MINUTE,GetUTCDate(),GetDate()),cast(replace('20161021-12:55:16.000','-',' ') as datetime))

Reuturns

2016-10-21 07:55:16.000

答案 2 :(得分:0)

试试这个......

select CONVERT(DATETIME, replace('20161021-12:55:16.000','-',' '), 102) 

对于EST

select dateadd(HH,-5,CONVERT(DATETIME, replace('20161021-12:55:16.000','-',' '), 102))

答案 3 :(得分:0)

 SELECT CONVERT(datetime,SWITCHOFFSET(CONVERT(datetimeoffset, 
                                REPLACE('20161021-12:55:16.000','-',' ')), 
                        DATENAME(TzOffset, SYSDATETIMEOFFSET()))) 
   AS ColumnInLocalTime