2015-11-06 84 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絕對是一個壞主意 –

相關問題