如果你看了輸出你仔細了,你的第二個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)。
你甚至想要做什麼? –
我想了解如何使用變量在Oracle SQL Developer中獲取日期範圍。 –
你不想要2個變量嗎? 1每個開始和結束日期? –