[英]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_date
是DATE
數據類型,而不是字符串數據類型。
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.