2017-07-17 5 views
0

Könnten Sie mir bitte helfen, die Syntax zu korrigieren? Ich muss unter Code in SQL Server schreiben. Dies funktioniert einwandfrei in Oracle-Datenbank.SQL Server-Abfrage - Korrektur in Syntax

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

Auch END_TS und BEGIN_TS sind von datetime Datentypen.

+0

Was passiert in Orakel in diesem Ausdruck 'END_TS - BEGIN_TS' –

+1

Wenn Sie' END_TS - BEGIN_TS' verwenden, um zwei Daten zu subtrahieren, sollten Sie [DATE_DIFF] (https://docs.microsoft.com/en -us/sql/t-sql/Funktionen/datediff-transact-sql) in 'SQL Server' –

+0

Also END_TS und BEGIN_TS sind Datetime Spalten in MySQL. Sind sie Timestamp-Spalten in Oracle? Wussten Sie außerdem, dass diese Abfrage einen ORA-906 verursacht? Sind Sie sicher, dass Sie den richtigen Text der Abfrage in Ihren Post einfügen? – jeff6times7

Antwort

0

In SQL Server kann Mathematik nicht direkt auf Daten ausgeführt werden, wie es in Oracle möglich ist. Sie benötigen eine datediff Funktion anzuwenden, um die Differenz zu berechnen, bevor Sie sie manipulieren:

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

Beachten Sie, dass der Ausdruck in dem Divisor eine Fließkommazahl in ihm haben muß (daher die“0,0"), ansonsten das Ergebnis wird auf eine Ganzzahl gerundet.

Nach der Datumsberechnung entspricht die left-Funktion der Teilzeichenfolge in Oracle. Es konvertiert in ein varchar und nimmt dann die ersten 10 Zeichen. Convert kehrt dann zu einem numerischen Wert zurück, der der Variablenlänge von Oracle entspricht. Es ist notwendig, convert mitzuteilen, dass Sie Ziffern nach der Dezimalzahl erwarten, andernfalls wird es gerundet.

Der Teilstring für die ersten 10 Zeichen hat einen schlechten Geruch, würde ich es auslassen. Dieses Snippet führt die Berechnung aus, ohne auf die ersten zehn Zeichen zu beschränken.

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

Beachten Sie auch, dass die Oracle-Version Bruchdaten bietet. Wenn Sie nur den ganzen Tag haben wollten, dann benutzen Sie "Tag" als Datepart-Parameter, um datediff.

+0

Danke Steven, lass mich es ausführen, aber wie geht das mit to_number (substring (a, 1,10) Teil? – Jocky

+0

Edited, um die String-Behandlung, die aussieht wie ein Hack zu mir. Ich denke, Sie sind besser dran ohne es . –