2017-05-03 62 views
0
select sysdate 
from dual; 
 
SYSDATE 
------- 
03-May-17 
select sysdate -1 
from dual; 
 
SYSDATE 
------- 
02-May-17 
============== 

SQL查詢如果運行下面的SQL查詢關於日期

select TO_DATE('01-DEC-15','DD-MON-YYYY') - 1 
FROM DUAL; 

我得到了答案
11月30日 - 15

= ==== 任何機構能幫助我嗎?瞭解這種行爲?

+4

它似乎不言自明。什麼讓你感到困擾? – bernie

+5

一切都一致。 '-1'在日期前一天送達。哪裏有問題 ? – Plirkee

+1

請注意,SYSDATE也有一個時間組件(前端程序沒有顯示......在設置中的某處進行控制)。 「-1」正好減去24小時; 'sysdate - 1'與'sysdate'具有相同的時間組件。你的'to_date(....)'例子也有一個時間組件(在Oracle中沒有「純」日期,沒有時間組件)。但是,在這種情況下,由於您沒有指定具體時間,所以默認爲00:00:00。 – mathguy

回答

0

該文檔有a section on datetime/interval arithmetic。添加到日期或從日期中減去的數字被視爲一天中的一小部分:

例如,SYSDATE + 1是明天。 SYSDATE - 7是一週前。 SYSDATE +(一千四百四十零分之十)是從現在

10分鐘作爲@mathguy指出,在甲骨文的所有日期時間組件,並sysdate具有當前服務器時間。如果顯示日期/時間的全部值,您可以看到發生了什麼。你可以做到這一點明確地to_char()和合適的格式,但爲了簡便起見這裏,我會改變我的會話NLS設置:

alter session set nls_date_format = 'SYYYY-MM-DD HH24:MI:SS'; 

select sysdate, sysdate - 1 
from dual; 

SYSDATE    SYSDATE-1   
-------------------- -------------------- 
2017-05-03 16:17:47 2017-05-02 16:17:47 

都顯示相同的時間,但在不同的日子。

您可以truncate a date降低精度;默認trunc(sysdate)零時間元素,所以它今天變成午夜而不是當前時間。

你的第三個例子更有趣一些,因爲你使用了不匹配的值和格式掩碼;有2位數的一年4位數YYYY掩蓋當年並沒有結束,你可能會認爲:

select to_date('01-DEC-15','DD-MON-YYYY'), to_date('01-DEC-15','DD-MON-YYYY') - 1 
from dual; 

TO_DATE('01-DEC-15', TO_DATE('01-DEC-15', 
-------------------- -------------------- 
0015-12-01 00:00:00 0015-11-30 00:00:00 

這可能不是你想要的。該RRRR的面膜則更加寬容,按照手冊中的描述:

select to_date('01-DEC-15','DD-MON-RRRR'), to_date('01-DEC-15','DD-MON-RRRR') - 1 
from dual; 

TO_DATE('01-DEC-15', TO_DATE('01-DEC-15', 
-------------------- -------------------- 
2015-12-01 00:00:00 2015-11-30 00:00:00 

但它會更好地提供一個完整的4位年份反正:更簡單

select to_date('01-DEC-2015','DD-MON-YYYY'), to_date('01-DEC-2015','DD-MON-YYYY') - 1 
from dual; 

TO_DATE('01-DEC-2015 TO_DATE('01-DEC-2015 
-------------------- -------------------- 
2015-12-01 00:00:00 2015-11-30 00:00:00 

,或者使用date literal

select date '2015-12-01', date '2015-12-01' - 1 
from dual; 

DATE'2015-12-01'  DATE'2015-12-01'-1 
-------------------- -------------------- 
2015-12-01 00:00:00 2015-11-30 00:00:00 

這也避免了問題同日語言; 'APR'將不會在語言(特別是NLS_DATE_LANGAUGE)不是英語的會話中得到識別(除非它巧妙地是公認的縮寫語言,但有些月份仍會失敗)。最好使用月份數字。如果您必須使用名稱或縮寫,則可以用to_date()的可選第三個參數指定它們所在的語言。但是如果你不從一個字符串變量轉換,文字仍然更容易。