2013-02-08 141 views
0

假設這有一個簡單的解決方案,但我找不到它。Oracle日期時間戳轉換

我想在Oracle的DATE字段上做一些邏輯。我的願望是採取一個日期字段,並從中減去X小時。

例如:SELECT A.MyDATE - 100 Hours from dual;

然而,我需要在一個時間戳格式 'YYYY-MM-DD HH:MM' 的結果。我試過CAST(A.MyDATE as TIMESTAMP) - NUMTODSINTERVAL(100/24,'day')然而它沒有工作。

我發現問題在於MyDATE字段在轉換爲時間戳時仍包含一些剩餘時間元素。我如何重置這些?

謝謝!

+0

首先,定義「沒有工作」。你得到了什麼結果?你期望的結果是什麼?當你談論「剩餘時間元素」時,你是否試圖在「MyDate」開啓的任何一天從午夜開始減去100小時,而不是從「MyDate」開始的任何時間減去100小時?你想讓你的查詢返回什麼數據類型?你發佈的查詢返回一個'timestamp',但如果你正在討論想要一個特定的格式,這意味着你想返回一個'varchar2'。 – 2013-02-08 19:12:27

+0

對不起,不夠清楚。如果MyDate是「2013-01-15」,我希望能得到「2013-01-10 20:00」。我沒有得到這個 - 我得到了像'2013-01-10 21:49'這樣的東西。我發現'MyDate'轉換爲時間戳時持有小時和分鐘,而不是00:00 - 不知道爲什麼。所以......我試圖在時間戳轉換後將MyDate的時間部分調零,但我不知道該怎麼做。 – NEW2WEB 2013-02-08 19:17:29

回答

2

你可以做這個用減法:

select a.MyDate - 100.0/24 

要轉換爲varchar:

select to_char(a.MyDate - 100.0/24, 'YYYY-MM-DD') 

而且,如果你想獲得的日期擺脫討厭的時間:

select trunc(a.MyDate - 100.0/24) as JustTheDate 
+0

您可能需要添加將結果格式化爲答案的to_char()。由你決定。 – 2013-02-08 19:24:17

+0

很好的答案,謝謝!一個問題,我如何將to_char輸出轉換回時間戳以便與當前系統日期進行比較? – NEW2WEB 2013-02-08 19:57:29

+0

如果我正確地閱讀了海報的評論,他們會想要在扣除日期之前「截斷」日期。否則,在他們發佈的示例中,如果「MyDate」爲「2013-01-15 00:00:00」,而不是「2013-01-10 20:00:00」 :49:00'。 – 2013-02-08 20:09:55

2

我的例子中的格式和日期可以更改爲任何其他格式和日期:

SELECT To_Timestamp(To_Char(Sysdate - INTERVAL '100' HOUR, 'MM/DD/YYYY HH24:MI'), 'MM/DD/YYYY HH24:MI') 
FROM dual 
/

Output: 

2/4/2013 10:18:00.000000000 AM 


To remove time element add Trunc() to any of your dates...: 

SELECT Trunc(To_Timestamp(To_Char(Sysdate - INTERVAL '100' HOUR, 'MM/DD/YYYY HH24:MI'), 'MM/DD/YYYY HH24:MI')) 
FROM dual 
/

Output: 2/4/2013 


Conversion/Casting - when using other dates in place of sysdate then add formats as in my other examples: 

SELECT CAST(SYSDATE AS TIMESTAMP) - INTERVAL '100' HOUR FROM dual 
/

Output: 2/4/2013 10:26:35.000000000 AM 


SELECT start_date tstamp_to_date, CAST(start_date AS timestamp) date_to_tstamp FROM 
(
    SELECT to_date(to_char(to_timestamp ('2013-02-07 10:07:47.000' , 'YYYY-MM-DD HH24:MI:SS.FF'),'DD-MON-YYYY HH24:MI:SS'), 'DD-MON-YYYY HH24:MI:SS') start_date 
    FROM dual 
) 
/

Output: 

tstamp_to_date   date_to_tstamp 
------------------------------------------------------- 
2/7/2013 10:07:47 AM 2/7/2013 10:07:47.000000 AM 
+0

我想Oracle的例子對於用戶來說太複雜了) – Art 2013-02-08 19:48:35

1

在Oracle中,一個DATE總是有一天和一個時間組件。根據您使用的工具和會話的NLS_DATE_FORMAT,在查看數據時,該工具完全有可能不顯示時間組件。但這只是一個顯示問題,它對實際數據沒有影響。

如果你想減去午夜百小時的一天,MyDate代表

SELECT TRUNC(MyDate) - interval '100' hour 
    FROM dual 

這將返回一個DATE。如果要以特定格式返回字符串

SELECT TO_CHAR(TRUNC(MyDate) - interval '100' hour, 'YYYY-MM-DD hh:mi am') 
    FROM dual 

請注意,我假設您的問題中存在拼寫錯誤。我假設你想顯示小時後的分鐘數(mi)而不是月份(mm)。

0

我想獲取30天以上的記錄(來自Mod_date),我使用下面的查詢,它返回所有的數據,我只想要30天的舊數據。

樣品: - Mod_date 03-NOV-12 12.00.00.000000000 AM

查詢: -

從fil_cnfact選擇Mod_date其中Mod_date < = SYSDATE -30以便通過Mod_date ASC;