簡體   English   中英

將Oracle Datetime格式查詢轉換為MS SQL Server格式

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM