Sql server 将SQL Server varchar转换为datetime进行算术运算

Sql server 将SQL Server varchar转换为datetime进行算术运算,sql-server,datetime,Sql Server,Datetime,我想将两个单独的列合并为日期时间,并在SQL Server中减去20小时 这在Oracle中起作用: 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

我想将两个单独的列合并为日期时间,并在SQL Server中减去20小时

这在Oracle中起作用:

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
这项工作:

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

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

select dateadd(hour, -20, '2015-11-05T15:08:00.0000000')
但如果超过3个零,则会出现
转换失败
错误。解决这个问题的一个简单方法是删除第二列到
时间的转换。当您使用时,您可以使用
+
而不是
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

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

select dateadd(hour, -20, '2015-11-05T15:08:00.0000000')
但如果超过3个零,则会出现
转换失败
错误。解决这个问题的一个简单方法是删除第二列到
时间的转换。当您使用时,您可以使用
+
而不是
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

如果
将值正确地转换为
日期时间
,则尝试执行的操作应该没有问题。您希望以以下格式或其他可接受的格式之一为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

如果
值正确地转换为
日期时间
,则尝试执行的操作应该没有问题。您希望以以下格式或其他可接受的格式之一为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

这很有效,非常感谢,非常感谢。concat绝对是一个糟糕的主意,它的作品,非常感谢,非常感谢。海螺绝对是个坏主意