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

Vik*_*nte 0 sql sql-server sql-server-2005 sql-server-2008 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) 
Run Code Online (Sandbox Code Playgroud)

它会抛出一个错误.

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

这些值也是UTC.

我需要将它们转换为EST.

感谢您的帮助.

Ric*_*ner 6

如果你对自己的格式保持一致有信心,那么你可以把它拿出去(我已经将日期时间用于说明目的);

CONVERT(DATETIME, REPLACE('20161021-12:55:16.000','-',' '), 102) 
Run Code Online (Sandbox Code Playgroud)

结果

2016-10-21 12:55:16.000
Run Code Online (Sandbox Code Playgroud)

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

CONVERT(DATETIME, DATEADD(hh,-5,CONVERT(DATETIME,REPLACE('20161021-12:55:16.000','-',' '))), 102)
Run Code Online (Sandbox Code Playgroud)

结果;

2016-10-21 07:55:16.000
Run Code Online (Sandbox Code Playgroud)

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

CONVERT(DATETIME, DATEADD(hh,-5,CONVERT(DATETIME,REPLACE('20161021-04:55:16.000','-',' '))), 102)
Run Code Online (Sandbox Code Playgroud)

结果

2016-10-20 23:55:16.000
Run Code Online (Sandbox Code Playgroud)

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

DATEADD(hh,-5,CONVERT(DATETIME,REPLACE('20161021-04:55:16.000','-',' ')))
Run Code Online (Sandbox Code Playgroud)

为了获得时间差,动态地做这样的事情;

DATEADD(hh,DATEDIFF(hh,GETUTCDATE(),GETDATE()),CONVERT(DATETIME,REPLACE('20161021-04:55:16.000','-',' ')))
Run Code Online (Sandbox Code Playgroud)