[英]Convert Oracle Datetime format query to MS SQL Server Format
我有一個Oracle查詢
SELECT to_timestamp('29-03-17 03:58:34.312000000 PM','DD-MM-RR HH12:MI:SS.FF AM')
FROM DUAL
我想轉換為SQL Server,我需要保留Oracle日期字符串,即'29-03-17 03:58:34.312000000 PM'
:
SELECT
CONVERT(DATETIME, REPLACE(REPLACE('29-03-2017 03:58:34.312000000 PM','-', '/'),'000000 ', ''), 131)
我嘗試了上面的查詢,因為131格式緊密匹配'29 -03-17 03:58:34.312000000 PM'格式'dd / mm / yyyy hh:mi:ss:mmmAM',但唯一的區別在於年份。
在Oracle年份是17年,SQL Server年份是2017年。我需要在年份前加20來使其成為2017年。此查詢轉換為Hijri日期時間。 我需要格里高利日期時間格式。
這是文檔。
https://docs.microsoft.com/en-us/sql/t-sql/functions/cast-and-convert-transact-sql
我需要將Oracle格式的字符串日期轉換為SQL Server等效日期。 有沒有什么方法可以提到像'dd / mm / yyyy hh:mi:ss:mmmAM'這樣的格式,而不是在轉換函數中提到像131,101,102這樣的日期格式代碼。
您可以這樣嘗試:
DECLARE @oracleDT VARCHAR(100)='29-03-17 03:58:34.312000000 PM';
SELECT CAST('<x>' + @oracleDT + '</x>' AS XML).value(N'(/x/text())[1]','datetime');
看來,XML隱含地能夠正確地做到這一點......
它適用於我的(德語)系統,但如果您設置了正確的日期格式,您可以強制執行此操作(請注意當前作業的副作用!)
嘗試此操作,然后刪除--
以嘗試替代日期格式。 或嘗試使用GERMAN
:
SET LANGUAGE ENGLISH;
SET DATEFORMAT mdy;
--SET DATEFORMAT ymd;
--SET DATEFORMAT dmy;
DECLARE @oracleDT VARCHAR(100)='01-02-03 03:58:34.312000000 PM';
SELECT CAST('<x>' + @oracleDT + '</x>' AS XML).value(N'(/x/text())[1]','datetime');
您可以在所有部分中拆分字符串並構建可轉換格式,如下所示:
DECLARE @oracleDT VARCHAR(100)='29-03-17 03:58:34.312000000 PM';
WITH AllParts(Casted) AS
(
SELECT CAST('<x>' + REPLACE(REPLACE(REPLACE(REPLACE(@oracleDT,'.','-'),' ','-'),':','-'),'-','</x><x>') + '</x>' AS XML)
)
SELECT CONVERT
(DATETIME,
DATENAME(MONTH,'2000'+Casted.value(N'x[2]/text()[1]','nvarchar(max)')+'01') + ' '
+ Casted.value(N'x[1]/text()[1]','nvarchar(max)') + ' '
+ N'20' + Casted.value(N'x[3]/text()[1]','nvarchar(max)') + ' '
+ Casted.value(N'x[4]/text()[1]','nvarchar(max)') + ':'
+ Casted.value(N'x[5]/text()[1]','nvarchar(max)') + ':'
+ Casted.value(N'x[6]/text()[1]','nvarchar(max)') + ':'
+ LEFT(Casted.value(N'x[7]/text()[1]','nvarchar(max)'),3)
+ Casted.value(N'x[8]/text()[1]','nvarchar(max)'),109)
FROM AllParts
雖然我不太明白需要使用不適合轉換的字符串格式,但您可以將字符串分成幾部分,然后通過將部分相互添加來構建它。 如果前8個字符使用格式樣式5轉換為datetime2,則為基礎部分。
select
t
, convert(varchar, converted ,121) converted
from (
select '29-03-17 03:58:34.312000000 PM' as t
) t
cross apply (
select
convert(datetime2,substring(t,1,8),5) dt2
, case when right(t,2) = 'PM' then convert(smallint,substring(t,10,2)) + 12
else convert(smallint,substring(t,10,2))
end hh
, convert(smallint,substring(t,13,2)) mi
, convert(smallint,substring(t,16,2)) ss
, convert(int,substring(t,19,9)) ns
) ca
cross apply (
select
dateadd(hh,hh,dateadd(mi,mi,dateadd(ss,ss,dateadd(ns,ns,dt2))))
as converted
) ca2
;
注意我能夠在第二個交叉應用中使用第一個交叉應用(dt1,hh,mi,ss,ns)的列別名來形成轉換后的datetime2值。
+--------------------------------+-----------------------------+
| t | converted |
+--------------------------------+-----------------------------+
| 29-03-17 03:58:34.312000000 PM | 2017-03-29 15:58:34.3120000 |
+--------------------------------+-----------------------------+
請參閱: http : //rextester.com/DZJ42703
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.