2016-12-29 70 views
4

當前我試圖從兩個日期列中選擇一個日期時間列。我遇到以下情況:如何合併來自一列的日期和來自另一列的時間

  1. FROMDATE包含無時間日期的列,例如, 08-01-2017 00:00:00
  2. FROMTIME列中包含沒有日期的時間,例如, 01-01-1899 13:50:00

現在我想在一列內選擇兩個列, SELECT (<what ever>) as FROMDATETIME ...

預期的結果:2017年8月1日十三點50分00秒

但我不能夠提取的日期和時間部分,並加在一起他們作爲一個datetime

口語中的一種meta sql:select (date(FROMDATE) + time(FROMTIME)) as FROMDATETIME

我試了很多TO_CHARTO_DATE,但無法得到期待的結果。

回答

4

在這裏你去:

SELECT TO_DATE(TO_CHAR(t.fromdate,'dd-mm-yyyy') || 
       ' ' || 
       TO_CHAR(t.fromtime,'hh24:mi:ss'),'dd-mm-yyyy hh24:mi:ss') as full_date_col 
FROM YourTable t 
+0

偉大的作品,謝謝! – BendEg

4

一種方法可以使用值的concatenatoin被鑄造一切燒焦,然後:

select to_date(to_char(FROMDATE, 'dd-mm-yyyy') || to_char(FROMTIME, 'hh24:mi:ss'), 'dd-mm-yyyyhh24:mi:ss') 
from test 

...但我想做的事(我無法)在Alex Poole的回答中

1

如果您的fromdatefromtime列是DATE類型,則可以執行以下操作:

SELECT 
    TO_DATE(
     TO_CHAR(fromdate, 'DD-MM-YYYY') || ' ' || TO_CHAR(fromtime, 'HH24:MI:SS'), 
     'DD-MM-YYYY HH24:MI:SS' 
    ) AS fromdatetime 
FROM my_table; 

如果列VARCHAR,你必須做以下

SELECT 
    TO_DATE(
     TO_CHAR(TO_DATE(fromdate, 'DD-MM-YYYY HH24:MI:SS'), 'DD-MM-YYYY') || ' ' || TO_CHAR(TO_DATE(fromtime, 'DD-MM-YYYY HH24:MI:SS'), 'HH24:MI:SS'), 
     'DD-MM-YYYY HH24:MI:SS' 
    ) AS fromdatetime 
FROM my_table; 
+0

感謝您的解釋! – BendEg

+0

@BendEg沒問題;) –

2

您還可以使用日期計算:

fromtime + (fromdate - trunc(fromtime)) 

fromdate - trunc(fromtime)部分得到的之間整個天數「時間」列中的名義日期(trunc將時間歸零)和「日期」列中的實際日期。在你的例子中,2017-01-08和1899-01-01之間是43106天。然後可以將該天數添加到fromtime,該日期在1899年將其日期增加43106天以匹配2017年日期。

快速演示,使用CTE來產生兩個示例值,並顯示天的日期之間的,以及你想要的結果:

with t (fromdate, fromtime) as (
    select date '2017-01-08', cast (timestamp '1899-01-01 13:50:00' as date) 
    from dual 
) 
select fromdate - trunc(fromtime) as days, 
    fromtime + (fromdate - trunc(fromtime)) as fromdatetime, 
    to_char(fromtime + (fromdate - trunc(fromtime)), 'DD-MM-YYYY HH24:MI:SS') as formatted 
from t; 

     DAYS FROMDATETIME  FORMATTED   
---------- ------------------- ------------------- 
    43106 2017-01-08 13:50:00 08-01-2017 13:50:00 
+0

請幫我理解;是括號中的「祕密」,然後在他發現括號時隱含的投射,對嗎? – Aleksej

+0

@Aleksej - 我已經更新了一些更多的解釋。括號中的位只是獲得了整個天數 - 並非真正的隱式轉換,這只是日期算術的返回值?這個數字加上原來的時間也只是正常的日期算術。 (圓括號是爲了使減法首先發生 - 否則你會得到數據+日期,得到ORA-00975) –

+1

優雅的解決方案總是顯而易見的,當你瞭解它們時......我可以做一筆高昂的捐贈嗎? :) – Aleksej

相關問題