2017-07-17 52 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

編輯添加字符串處理,這看起來像一個黑客我認爲你最好沒有它。 –