簡體   English   中英

如何在 oracle 中搜索給定月份和年份的特定日期?

[英]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 )

(注意:如果您在日期列上使用TRUNCTO_CHAR ,則 Oracle 將不會在該列上使用索引;您需要在您使用的確切表達式上使用單獨的基於函數的索引。相反,通過計算年份的范圍/month 輸入而不是轉換日期列然后 Oracle 將使用日期列上的索引。)

(注意 2:您不想在2020-01-012020-01-31的范圍內進行比較,因為這將忽略從2020-01-31T00:00:012020-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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM