将varchar(例如20151125175706 + 0800)转换为SQL中的Datetime

时间:2016-10-25 12:54:44

标签: sql-server datetime

如何在SQL Server中将yyyymmddhhmmss + offset(20151125175706 + 0800)转换为日期时间格式?可以在日期时间比较中使用的内容,以选择在最后一分钟内在表格中输入的记录。

我从消息的OBX段获取此格式,并且我将其保存在表中的varchar字段中。

我试图这样做(除其他外):

QProcess

此查询仅提供表中1020行中的522行,并显示错误消息 "将varchar数据类型转换为日期时间数据类型会导致超出范围的值。"

请帮我解决这个问题。

2 个答案:

答案 0 :(得分:1)

使用TRY_CONVERT查找错误值:

select pi.*
from (select try_convert(ddatetime,
                         (SUBSTRING(OBXDateTime, 1, 4) + '-' +  
                          SUBSTRING(OBXDateTime, 5, 2) + '-' + 
                          SUBSTRING(OBXDateTime, 7, 2) + ' ' +  
                          SUBSTRING(OBXDateTime, 9, 2) + ':' +
                          SUBSTRING(OBXDateTime, 11, 2) + ':' +
                          SUBSTRING(OBXDateTime, 13, 2)
                         ), 101) as datetime) as dte, pi.*
      from ObservationPatInfo pi
     ) pi
where dte is null;

答案 1 :(得分:1)

你可以试试这个:

DECLARE @YourDt VARCHAR(100)='20151125175706+0800';
DECLARE @ISO8601_with_TimeZone VARCHAR(100);

--This will use multiple STUFFs to get the separators into your string
SELECT @ISO8601_with_TimeZone = STUFF(STUFF(STUFF(STUFF(STUFF(STUFF(@YourDt,18,0,':'),13,0,':'),11,0,':'),9,0,'T'),7,0,'-'),5,0,'-');

--This looks like a properly formatted datetime now: 2015-11-25T17:57:06+08:00
SELECT @ISO8601_with_TimeZone;

--Use DATETIME2 and code 127 to convert ISO8601 with TimeZone
SELECT CONVERT(datetime2,@ISO8601_with_TimeZone,127);