簡體   English   中英

從 Oracle 數據庫中的年份獲取月份和日期

[英]Get month and Date from Year in Oracle Database

我試圖從用戶輸入的年份中獲取日期和月份。

我使用的查詢是:

SELECT trans_date FROM transactions WHERE (SUBSTR(trans_date,4,4) = 'June' AND TO_NUMBER(SUBSTR(trans_date,9,4)) = 2010); 

這不起作用,但如果我對 DUAL 表做同樣的事情,它就可以工作。

SELECT SUBSTR('22-June-2018', 4, 4) FROM DUAL;

它有什么問題?

你有沒有考慮過像to_char()這樣的東西?

SELECT trans_date
FROM transactions
WHERE TO_CHAR(trans_date, 'YYYY-MM') = '2010-06';

或者更好的是,適當的日期比較:

WHERE trans_date >= DATE '2010-06-01' AND
      trans_date < DATE '2010-07-01'

這樣做的好處是查詢可以使用trans_date上的索引。

SELECT to_char(to_date(trans_date,'DD-Month-YYYY'),'DD') day,
       to_char(to_date(trans_date,'DD-Month-YYYY'),'Month') month
FROM transactions
WHERE to_char(to_date(trans_date,'DD-Month-YYYY'),'Month') = 'June' 
AND to_char(to_date(trans_date,'DD-Month-YYYY'),'YYYY') = '2010'); 

它有什么問題?

SUBSTR( string_value, start, length )將字符串數據類型作為第一個參數。 '22-June-2018'不是DATE數據類型 - 它是字符串數據類型(恰好包含我們識別為日期的字符); 所以使用SUBSTR( '22-June-2018', 4, 4 )按預期工作。

trans_dateDATE數據類型,而不是字符串數據類型。

SUBSTR( trans_date, 4, 4 )

涉及從日期到字符串的隱式轉換; 所以有效地做:

SUBSTR( TO_CHAR( trans_date ), 4, 4 )

由於TO_CHAR( date_value, format_model )需要知道如何將DATE格式化為字符串,如果您不提供第二個參數,那么它將使用NLS_DATE_FORMAT會話參數並且表達式有效:

SUBSTR(
  TO_CHAR(
    trans_date
    ( SELECT value FROM nls_session_parameters WHERE parameter = 'NLS_DATE_FORMAT' )
  ),
  4,
  4
)

如果NLS_DATE_FORMAT會話參數不匹配DD-Month-YYYY (或其中第 4-7 個字符是月份(這僅適用於 4 個字符的月份名稱)和第 9-12 個字符是年份(同樣,這將僅適用於具有 4 個字符的名稱的月份),那么您的查詢將不起作用。

我試圖從用戶輸入的年份中獲取日期和月份。

使用EXTRACT

SELECT trans_date
FROM   transactions
WHERE  EXTRACT( MONTH FROM trans_date ) = 6
AND    EXTRACT( YEAR  FROM trans_date ) = 2010

使用TO_CHAR( date_value, format_model )

SELECT trans_date
FROM   transactions
WHERE  TO_CHAR( trans_date, 'Month' ) = 'June'
AND    TO_CHAR( trans_date, 'year'  ) = '2010'

使用日期文字:

SELECT trans_date
FROM   transactions
WHERE  trans_date >= DATE '2010-06-01'
AND    trans_date < ADD_MONTHS( DATE '2010-06-01', 1 );

使用TRUNC( date_value, 'MM' )

SELECT trans_date
FROM   transactions
WHERE  TRUNC( trans_date, 'MM' ) = DATE '2010-06-01';

你可以使用像

WHERE TO_CHAR(date_column_name,'MM-YYYY')='06-2010'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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