Sql 在Oracle数据库中获取年的月份和日期

Sql 在Oracle数据库中获取年的月份和日期,sql,oracle,Sql,Oracle,我正在尝试获取用户输入的日期和月份 我使用的查询是: SELECT trans_date FROM transactions WHERE (SUBSTR(trans_date,4,4) = 'June' AND TO_NUMBER(SUBSTR(trans_date,9,4)) = 2010); 这是不工作,但如果我做同样的双表它的工作 SELECT SUBSTR('22-June-2018', 4, 4) FROM DUAL; 有什么问题吗?您是否考虑过类似于to_char() 或者更好

我正在尝试获取用户输入的日期和月份

我使用的查询是:

SELECT trans_date FROM transactions WHERE (SUBSTR(trans_date,4,4) = 'June' AND TO_NUMBER(SUBSTR(trans_date,9,4)) = 2010); 
这是不工作,但如果我做同样的双表它的工作

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

有什么问题吗?

您是否考虑过类似于
to_char()

或者更好的是,进行适当的日期比较:

WHERE trans_date >= DATE '2010-06-01' AND
      trans_date < DATE '2010-07-01'
其中trans_date>=日期“2010-06-01”和
运输日期<日期“2010-07-01”
这样做的好处是,查询可以在
trans\u 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\u value,start,length)
将字符串数据类型作为第一个参数
'22-June-2018'
不是日期数据类型-它是字符串数据类型(刚好包含我们识别为日期的字符);因此,使用
SUBSTR('2018年6月22日',4,4)
的效果与预期一致

trans_date
date
数据类型,而不是字符串数据类型

SUBSTR( trans_date, 4, 4 )
涉及从日期到字符串的隐式转换;有效的做法也是如此:

SUBSTR( TO_CHAR( trans_date ), 4, 4 )
由于,
TO_CHAR(date\u value,format\u model)
需要知道如何将
date
格式化为字符串,如果不提供第二个参数,则它将使用
NLS\u date\u format
会话参数,表达式有效地为:

SUBSTR(
  TO_CHAR(
    trans_date
    ( SELECT value FROM nls_session_parameters WHERE parameter = 'NLS_DATE_FORMAT' )
  ),
  4,
  4
)
如果
NLS\u DATE\u FORMAT
session参数与
DD Month YYYY
(或4-7个字符为Month(仅适用于4个字符的月份名称)和9-12个字符为year(同样,这仅适用于具有4个字符名称的月份)不匹配,则查询将不起作用

我正在尝试获取用户输入的日期和月份

使用
提取

SELECT trans_date
FROM   transactions
WHERE  EXTRACT( MONTH FROM trans_date ) = 6
AND    EXTRACT( YEAR  FROM trans_date ) = 2010
使用
来指定字符(日期、值、格式、型号)

使用日期文字:

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

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

trans\u date
的数据类型是什么?
trans\u date
的示例值是什么?可能是因为2010年和2018年?如果是字符串,(a)不应该是,和(b)随着月份名称长度的变化,你需要更巧妙地找到年初。我想你是在回答从日期到字符串的隐式转换,在这种情况下,请使用Gordon的方法。也许你的客户将日期值与NLS设置分开格式化,这也可能会让你感到困惑;但这是一种错误我不是做这件事的好方法。
SELECT trans_date
FROM   transactions
WHERE  trans_date >= DATE '2010-06-01'
AND    trans_date < ADD_MONTHS( DATE '2010-06-01', 1 );
SELECT trans_date
FROM   transactions
WHERE  TRUNC( trans_date, 'MM' ) = DATE '2010-06-01';
WHERE TO_CHAR(date_column_name,'MM-YYYY')='06-2010'