2017-07-17 54 views
0

您能否帮我纠正语法? 我必须在SQL服务器中写下面的代码。 这在Oracle数据库中工作得非常好。SQL Server查询 - 语法更正

Select to_number(substr((((END_TS - BEGIN_TS)*(24*60*60))),1,10)) AS EXECUTION_TIME 
from TABLE B 

而且END_TSBEGIN_TSdatetime数据类型。

+0

如果你是'END_TS - BEGIN_TS'使用这个来减去两个日期,你应该使用[DATE_DIFF](https://docs.microsoft.com/zh-CN/library/default.aspx?displaylang=zh-cn),在此表达式中会发生什么情况END_TS - BEGIN_TS' –

+1

-us/sql/t-sql/functions/datediff-transact-sql)在'SQL Server'中 –

+0

所以END_TS和BEGIN_TS是MySQL中的日期时间列。他们是否在Oracle中使用时间戳列?此外,你知道这个查询会导致ORA-906吗?您确定您正在将正确的查询文本粘贴到您的文章中吗? – jeff6times7

回答

0

在SQL Server中,数学运算不能直接在日期上执行,因为它可以在Oracle中执行。您需要申请datediff函数来计算差值你操纵它之前:

select convert(numeric(10,9),left(datediff(second,begin_ts,end_ts)/(24.0*60*60),10)) from table; 

注意的是,在除数表达需要有它的一个浮点数(因此” .0" ),否则结果被四舍五入为整数。

执行日期计算后,left函数等同于Oracle中的子字符串。它转换为一个varchar然后采用前10个字符。转换然后返回到一个数字,这是Oracle的可变长度数字的等价物。有必要告诉convert你期望小数点后面的数字,否则它会四舍五入。

前10个字符的子字符串有难闻的气味,我会放弃它。这段代码不会限制前十个字符的计算。

select datediff(second,begin_ts,end_ts)/(24.0*60*60) from table; 

另请注意,Oracle版本提供分数日期。如果你只需要整天,那么使用“day”作为dateiff的datepart参数。

+0

感谢史蒂芬,让我执行它,但如何处理to_number(substring(a,1,10)部分? – Jocky

+0

编辑添加字符串处理,这看起来像一个黑客我认为你最好没有它。 –