2016-02-23 42 views
1

需要您的幫助才能結束查詢以獲取sysdate月份的上次日期時間。月份的最後日期

select to_char(last_day(sysdate),'DD-Mon-YYYY HH24:MI:SS') from dual 

它給預期最後日期,但我需要時間23:59:00這是不可能的直通上面的查詢。

+3

如果您正在嘗試定義範圍,則幾乎總是能夠更容易地計算*獨佔*端點。例如。使用下個月的第一天(容易計算),並使用'<'而不是'<='。 –

回答

1

你可以使用TRUNC在第二天即SYSDATE + 1,然後減去60秒即60/86400以獲得所需的輸出。

SQL> SELECT to_char((trunc(last_day(sysdate)) +1) - 60/86400,'DD-Mon-YYYY HH24:MI:SS') dt 
    2 FROM dual; 

DT 
-------------------- 
29-Feb-2016 23:59:00 

SQL> 

你也可以使用interval '1' minuteinterval '60' second代替60/86400

0

如果你只是想爲出於某種原因顯示你可以硬編碼的時間到格式掩碼:

select to_char(last_day(sysdate), 'DD-Mon-YYYY "23:59:00"') from dual; 

但你可能真的想它作爲一個日期對象,在這種情況下你可以添加23小時59分鐘到截斷(午夜)爲止,wchi是一天1440分鐘1439:

select to_char(trunc(last_day(sysdate)) + 1439/1440, 'DD-Mon-YYYY HH24:MI:SS') 
from dual; 

或者你可以去到第二天,並刪除了一分鐘,要麼分數天或間隔:

select to_char(trunc(last_day(sysdate)) + interval '1' day - interval '1' minute, 
    'DD-Mon-YYYY HH24:MI:SS') from dual; 

一般來說,如果你有時間段的工作,你要包括高達23:59:59,您也可以做任何的這些方法,但作爲Damien_The_Unbeliever在評論說,它更容易與下一個時期的開始比較(例如, < add_months(trunc(sysdate, 'MM'), 1)。由於沒有適當考慮時間,尤其是在實際上有時間戳而不是日期的情況下,意外地錯過部分時間很容易。