[英]How to search a specific date from a given month and year in oracle?
給我的月份是 1 表示一月,一年是 2020。現在我想搜索 2020 年一月之間的日期。 假設那一天是 2020 年 1 月 14 日,所以我正在嘗試以下代碼
select date
from table X
where date between to_date(1||'/'||month||'/'||year,'dd/mm/yyyy')
and to_date(31||'/'||month||'/'||year,'dd/mm/yyyy')
但這個范圍是針對一月份的,如果月份是二月或四月,有 30 天怎么辦? 如果這個查詢不合適那么如何達到完美的結果呢?
你可以像下面那樣做,
要查找給定日期的第一個日期和最后一個日期,
select trunc(date'2020-02-14','MM') first_day,
last_day(date'2020-02-14') last_day
from dual;
編輯:在其他用戶的評論之后所以最終的查詢就像,
select date
from table X
where date between trunc(date'2020-02-14','MM') and last_day(date'2020-02-14');
注意:如果您將日期與時間一起存儲,您可能會喜歡@MT0 提供的答案
您可以通過to_char
轉換日期以提取要比較的部分。
select *
from dates
where to_char(the_date, 'mm') = '01'
and to_char(the_date, 'yyyy') = '2020'
它的 SQL-Fiddle在這里
使用TO_DATE( your_year_value || '-' || you_month_value, 'YYYY-MM' )
將年月值轉換為日期,然后獲取上限,您可以使用ADD_MONTHS
function 找到下個月的開始:
SELECT *
FROM table_name
WHERE date_time >= TO_DATE( 2020 || '-' || 1, 'YYYY-MM' )
AND date_time < ADD_MONTHS( TO_DATE( 2020 || '-' || 1, 'YYYY-MM' ), 1 )
(注意:如果您在日期列上使用TRUNC
或TO_CHAR
,則 Oracle 將不會在該列上使用索引;您需要在您使用的確切表達式上使用單獨的基於函數的索引。相反,通過計算年份的范圍/month 輸入而不是轉換日期列然后 Oracle 將使用日期列上的索引。)
(注意 2:您不想在2020-01-01
到2020-01-31
的范圍內進行比較,因為這將忽略從2020-01-31T00:00:01
到2020-01-31T23:59:59
。相反,您需要使用從2020-01-01
到但不包括2020-02-01
的范圍。)
所以,對於一些測試數據:
CREATE TABLE table_name ( date_time DATE );
INSERT INTO table_name( date_time )
SELECT DATE '2020-01-14' FROM DUAL UNION ALL
SELECT DATE '2020-01-31' + INTERVAL '1' HOUR FROM DUAL UNION ALL
SELECT DATE '2020-02-01' FROM DUAL
這輸出:
| 日期_時間 | |:-------------------- | | 2020-01-14T00:00:00 | | 2020-01-31T01:00:00 |
db<> 在這里擺弄
您只想檢查月份和年份是否匹配,所以不必擔心日期。 您可以檢查月份和年份是否匹配,而不是檢查一個值是否在 2 個特定日期之間。
SELECT date
FROM table
WHERE TO_CHAR(date,'MM-YYYY') = '01-2020'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.