簡體   English   中英

將Oracle查詢遷移到PostgreSQL

[英]Migrating Oracle query to PostgreSQL

你能幫我嗎? 如何將以下查詢轉換為PostgreSQL。

下面的查詢在PostgreSQL中執行時與在Oracle中執行時給出不同的輸出。

SELECT 
  to_char(to_date('01011970','ddmmyyyy') + 1/24/60/60 * 4304052,'dd-mon-yyyy hh24:mi:ss') 
from dual;

假設您要使用與Oracle中相同的表達式來計算結果值。

當您簡單地from dual刪除時,它不起作用的原因是由於整數除法將結果截斷為0 ,此表達式的計算結果為0。

select 1/24/60/60 * 4304052;
 ?column?
----------
        0
(1 row)

如果我將其中一個設為小數,它將為您提供所需的結果

select 1.0/24/60/60 * 4304052;
          ?column?
-----------------------------
 49.815416666666666347848000

現在,更改此設置后,您的表達式將返回與Oracle中相同的結果。

SELECT  to_char( to_date('01011970','ddmmyyyy')
 +  INTERVAL '1 DAY' *  (1.0/24/60/60 * 4304052) ,'dd-mon-yyyy hh24:mi:ss') ;
       to_char
----------------------
 19-feb-1970 19:34:12
(1 row)

請注意,我必須添加一個間隔表達式,因為與Oracle不同,Postgres DATE不存儲時間分量,而僅添加一個數字會導致錯誤。 使用間隔將確保將其評估為時間戳。

knayak=# select pg_typeof( current_date);
 pg_typeof
-----------
 date
(1 row)

knayak=# select pg_typeof( current_date + INTERVAl '1 DAY');
          pg_typeof
-----------------------------
 timestamp without time zone
(1 row)

我想你要:

select '1970-01-01'::date + 4304052 * interval '1 second';

如果確實需要,可以使用to_char()將其轉換回字符串:

select to_char('1970-01-01'::date + 4304052 * interval '1 second', 'YYYY-MM-SS HH24:MI:SS');

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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