2015-11-06 83 views
1

我想将两个单独的列组合到日期时间中,并在SQL Server中减去20小时。将SQL Server varchar转换为用于算术的datetime

此作品在甲骨文:

create table t (x varchar2(8),y varchar2(6)); 

insert into t values ('20151106','090000'); 

select to_char(to_date(x||' '||y, 'yyyymmdd hh24miss') 
      - (20/24),'dd-mm-yyyy hh24:mi:ss') as "date minus 20 hrs" from t; 

date minus 20 hrs 
- ----------------- 
05-11-2015 13:00:00 

我不能在SQL Server破解它,我可以得到部分的工作,但不能合并这两个日期(太多的功能)。

这工作:

CREATE TABLE t (x VARCHAR(8), y VARCHAR(6)) 

INSERT INTO t 
VALUES('20151105', '150800') 

SELECT 
    DATEADD(HOUR, -20, CAST(CONCAT(SUBSTRING(y, 1, 2), ':', SUBSTRING(y, 3, 2), ':', SUBSTRING(y, 5, 2)) AS TIME)) 
FROM t 

这工作:

SELECT DATEADD(HOUR, -20, x) 
FROM t 

但我不能将它们合并:

SELECT 
    DATEADD(HOUR, -20, 
      CONCAT(SUBSTRING(x, 1, 4), '-', SUBSTRING(x, 5, 2), '-', 
        SUBSTRING(x, 7, 2), ' ', 
        CAST(CONCAT(SUBSTRING(y, 1, 2), ':', SUBSTRING(y, 3, 2), 
           ':', SUBSTRING(y, 5, 2)) AS TIME))) 
FROM t 

回答

0

如果CONVERT的正确的价值观datetime,应该没有什么问题你正在努力。你想给SQL Server中的以下格式的日期,或者其他可接受的格式之一:

YYYYMMDD HH:MM:SS  

所以将其应用于您的样品,日期部分是好的,但你需要得到的时间格式正确之前,你可以将其转换为有效日期:

CREATE TABLE #t (x VARCHAR(8), y VARCHAR(6)) 
INSERT INTO #t 
VALUES ('20151105', '150800') 
-- we want 20151105 15:08:00 
SELECT DATEADD(HOUR, -20, 
       (CONVERT(DATETIME, x + ' ' + 
          LEFT(y, 2) + ':' + 
          SUBSTRING(y, 3, 2) + ':' + 
          RIGHT(y, 2)))) AS Result 
FROM #t 

DROP TABLE #t 

可生产

2015-11-04 19:08:00.000 
+0

完美,谢谢你,非常感谢。 –

0

你传递给datepart的字符串的计算结果为:

select dateadd(hour, -20, '2015-11-05T15:08:00.0000000') 

但是,如果超过3个零,您将得到一个Conversion failed错误。解决这个问题的一个简单方法是将第二列的转换删除到time。当你在这,你可以使用+代替concat,这是更容易阅读:

select dateadd(hour, -20, 
      substring(x,1,4) + '-' + 
      substring(x,5,2) + '-' + 
      substring(x,7,2) + 'T' + 
      substring(y,1,2) + ':' + 
      substring(y,3,2) + ':' + 
      substring(y,5,2)) 
from t 

See it working at SE Data.

+0

这个工作,非常感谢你,大加赞赏。 concat绝对是一个坏主意 –

相关问题