2017-07-26 95 views
0

如何更改下面的代碼以獲取日期範圍而不是某一天?代碼1作品,代碼2不會(我使用的Oracle SQL Developer)在Oracle SQL Developer中使用變量作爲日期範圍

CODE 1

DEFINE date1 = '01-JUN-17' 
SELECT * 
FROM op_all_appointments OP 
WHERE OP.ATTENDANCE_DTTM = '&&date1' 

我試過以下,但它不工作?這爲2017年6月1日返回的數據只有

CODE 2

DEFINE date1 between '01-JAN-17' and '30-JUN-17' 
SELECT * 
FROM op_all_appointments OP 
WHERE OP.ATTENDANCE_DTTM = '&&date1' 

謝謝

+0

你甚至想要做什麼? –

+0

我想了解如何使用變量在Oracle SQL Developer中獲取日期範圍。 –

+2

你不想要2個變量嗎? 1每個開始和結束日期? –

回答

1

如果你看了輸出你仔細了,你的第二個define你會看到:

SP2-0135: symbol date1 between '01-jan-17' and '30-jun-17' is UNDEFINED 

使命令不付諸行動,您的第一個定義仍然有效,因此您仍然可以看到第一個日期的數據。

你可以做到這一點,一氣呵成有:

DEFINE date1 = between '01-JAN-17' and '30-JUN-17' 

這在缺少=造成該SP錯誤增加;查詢woudl然後更改爲:

... 
WHERE OP.ATTENDANCE_DTTM = &&date1 

沒有等號,沒有周圍的替代變量的報價。

但因爲這是靠隱式轉換和你的NLS設置,真的是你需要做的:

DEFINE date1 = between to_date('01-JAN-17', 'DD-MON-RR', 'NLS_DATE_LANGUAGE=''ENGLISH''') and to_date('30-JUN-17', 'DD-MON-RR', 'NLS_DATE_LANGUAGE=''ENGLISH''') 

或者更簡單地使用日期文字:

DEFINE date1 = between date '2017-01-01' and date '2017-06-30' 

它可能會更整潔使用兩個變量:

DEFINE date1 = 2017-01-01 
DEFINE date2 = 2017-06-30 

... 
WHERE OP.ATTENDANCE_DTTM between date '&&date1' and date '&&date2' 

還值得注意的是,如果您的列有tim除了午夜之外 - 如DTTM建議 - 您將錯過該範圍最後一天的任何數據,即2017年3月30日午夜之後的任何數據。它通常是一個安全的範圍:

DEFINE date1 = 2017-01-01 
DEFINE date2 = 2017-07-01 

... 
WHERE OP.ATTENDANCE_DTTM >= date '&&date1' 
AND OP.ATTENDANCE_DTTM < date '&&date2' 

和你可以在一個單一的替代變量如果你真的想要相同的範圍比較。

您可能還想考慮使用綁定變量而不是替換變量 - 儘管如此,您不能使用日期文字,但仍應堅持獨立於語言的格式,並使用帶有明確格式掩碼的to_date();例如:

var date1 varchar2(10); 
var date2 varchar2(10); 
exec :date1 := '2017-01-01'; 
exec :date2 := '2017-07-01'; 

... 
WHERE OP.ATTENDANCE_DTTM >= to_date(:date1, 'YYYY-MM-DD') 
AND OP.ATTENDANCE_DTTM < to_date(:date2, 'YYYY-MM-DD') 

......您無法在單個變量中執行任何操作(無論使用普通SQL)。

+0

嗨亞歷克斯,我不能感謝你足夠的直覺幫助。你的回答(DEFINE date1 = '01 -JAN-17'和'30 -JUN-17'之間)適合我。好東西 –

-1
DEFINE date1 = 'between ''01-JAN-17'' and ''30-JUN-17''' 
SELECT * 
FROM op_all_appointments OP 
WHERE OP.ATTENDANCE_DTTM '&&date1' 

OR(嘗試這兩種)

DEFINE date1 = 'between ''01-JAN-17'' and ''30-JUN-17''' 
SELECT * 
FROM op_all_appointments OP 
WHERE OP.ATTENDANCE_DTTM &&date1 
+0

謝謝你的幫助。不幸的是,這不起作用:ORA-00920:無效的關係運算符 00920. 00000 - 「無效關係運算符」 *原因: *操作: 錯誤在行:4列:28 –

+0

代碼中的錯誤 - 現在試試 –

+0

謝謝Sergiu,第二個代碼爲我工作。非常感謝 –

0

這是你應該正在做

SELECT * 
FROM op_all_appointments OP 
WHERE OP.ATTENDANCE_DTTM between date '2017-01-01' and date '2017-06-30' 

如果你想使用CTE

WITH data AS 
    (SELECT DATE '2017-01-01' date1, 
      DATE '2017-06-30' date2 
    FROM dual 
    ) 
SELECT * 
FROM dual, 
    data 
WHERE sysdate BETWEEN data.date1 AND data.date2; 
+1

謝謝Sudipta,但這不是我想要了解的。 –

+0

您的選擇是使用兩個變量或使用CTE或PLSQL記錄類型。但我不確定,你會想使用PLSQL。 –