在SQL Server查询中将数字日期转换为日期时间

时间:2013-07-15 14:09:07

标签: sql sql-server datetime

我的此查询运行无错:

Select
    [Object], 
    CASE WHEN MsgID = '61' THEN SUBSTRING(Parms,35,6) END AS [MEDIA]
from JnlDataSection
WHERE [Object] = '061 STATEMENTS'

我对此表感兴趣的第三列名为Date。但是数据库是很久以前开发的,并且那个人将日期变成了(numeric(17,9), not null数据类型。例如。 20130106.050257023

我想要的是将其分为两个不同的列,一个作为日期:2013-01-06,第二个作为时间:05:02:57(无微秒)。

我想出了这个转换的查询:

Select
       [Object], 
       CAST(DATEADD(HOUR,-4,CONVERT(DATETIME,LEFT([Date],8)+' '+
       SUBSTRING([Date],10,2)+':'+
       SUBSTRING([Date],12,2)+':'+
       SUBSTRING([Date],14,2)+'.'+
       SUBSTRING([Date],15,3))) AS DATE) 'Date',
       LEFT(CAST(DATEADD(HOUR,-4,CONVERT(DATETIME,LEFT([Date],8)+' '+
       SUBSTRING([Date],10,2)+':'+
       SUBSTRING([Date],12,2)+':'+
       SUBSTRING([Date],14,2)+'.'+
       SUBSTRING([Date],15,3))) AS TIME),8) 'Time',
       CASE WHEN MsgID = '61' THEN SUBSTRING(Parms,35,6) END AS [MEDIA]
from JnlDataSection
WHERE [Object] = '061 STATEMENTS' 
  AND CAST(substring(convert(varchar(50), [Date]), 0, 5) + '-' +
      substring(convert(varchar(50), [Date]), 5, 2) + '-' +
      substring(convert(varchar(50), [Date]), 7, 2) AS DATETIME) =
      CONVERT(date, DATEADD(day, -1, getdate()))  --Converting

但是,当我运行此命令时收到此错误:

  

Msg 8116,Level 16,State 1,Line 1
  对于子字符串函数的参数1,参数数据类型numeric无效。

任何人都可以修改我的查询以使其无错运行吗?非常感谢。

1 个答案:

答案 0 :(得分:2)

数据是数字类型。您必须先将其转换为字符串类型,然后才能将其与子字符串函数一起使用:

substring(cast([date] as varchar(18)), 10,2)

就此而言,您的最终目标应该是将这些值转换为日期时间列。