您能否帮我纠正语法? 我必须在SQL服务器中写下面的代码。 这在Oracle数据库中工作得非常好。SQL Server查询 - 语法更正
Select to_number(substr((((END_TS - BEGIN_TS)*(24*60*60))),1,10)) AS EXECUTION_TIME
from TABLE B
而且END_TS
和BEGIN_TS
是datetime
数据类型。
您能否帮我纠正语法? 我必须在SQL服务器中写下面的代码。 这在Oracle数据库中工作得非常好。SQL Server查询 - 语法更正
Select to_number(substr((((END_TS - BEGIN_TS)*(24*60*60))),1,10)) AS EXECUTION_TIME
from TABLE B
而且END_TS
和BEGIN_TS
是datetime
数据类型。
在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参数。
感谢史蒂芬,让我执行它,但如何处理to_number(substring(a,1,10)部分? – Jocky
编辑添加字符串处理,这看起来像一个黑客我认为你最好没有它。 –
如果你是'END_TS - BEGIN_TS'使用这个来减去两个日期,你应该使用[DATE_DIFF](https://docs.microsoft.com/zh-CN/library/default.aspx?displaylang=zh-cn),在此表达式中会发生什么情况END_TS - BEGIN_TS' –
-us/sql/t-sql/functions/datediff-transact-sql)在'SQL Server'中 –
所以END_TS和BEGIN_TS是MySQL中的日期时间列。他们是否在Oracle中使用时间戳列?此外,你知道这个查询会导致ORA-906吗?您确定您正在将正确的查询文本粘贴到您的文章中吗? – jeff6times7