Sql 选择特定年份的记录

Sql 选择特定年份的记录,sql,oracle11g,Sql,Oracle11g,我有一个存储事务的oracle表和一个日期列。如果我需要选择一年的记录,比如2013年,我会这样做: select * from sales_table where tran_date >= '01-JAN-2013' and tran_date <= '31-DEC-2013' 选择* 从销售表 其中,交易日期>='2013年1月1日' 和tran_date使用函数从日期中提取年份: select * from sales_table where extract(Y

我有一个存储事务的oracle表和一个日期列。如果我需要选择一年的记录,比如2013年,我会这样做:

select * 
  from sales_table
 where tran_date >= '01-JAN-2013'
   and tran_date <= '31-DEC-2013'
选择*
从销售表
其中,交易日期>='2013年1月1日'
和tran_date使用函数从日期中提取年份:

select * from sales_table
where extract(YEAR from tran_date) = 2013

您可以使用更新功能

选择*
从销售表
其中,交易日期>=截止日期('1.1.'2013,'DD.MM.YYYY'),以及
交易日期<截止日期('1.1.| |(2013+1),'DD.MM.YYYY')
具有显式比较的解决方案
(传输日期>=…和传输日期<…)
能够在
传输日期
字段上使用索引


考虑边界:例如,如果
tran_date='31.12.2013 18:24:45.155'
比您的代码
tran_date更重要,如果
tran_date
被索引,这种提取的使用会强制表扫描,还是Oracle会将其转换为范围搜索?(其他SQL方言中的等效方法通常会产生一个扫描,这可能导致效率极低。)谢谢,我也尝试了DAY和MONTH,发现我可以做同样的事情。这是否意味着如果date字段被索引,那么我就注定要失败从技术上讲,您可以(在Oracle中)在函数上创建索引(在本例中是在EXTRACT(年份…)上):我认为您是对的。事实上,我已经错过了好几次了。
select *
  from sales_table
 where tran_date >= to_date('1.1.' || 2013, 'DD.MM.YYYY') and 
       tran_date < to_date('1.1.' || (2013 + 1), 'DD.MM.YYYY')
select last_name,hire_date 
from employees
where extract(year from hire_date) = 2006;
select FIRST_NAME , to_char(hire_date, 'YYYY') YR FROM employees where to_char(hire_date, 'YYYY')= '2006'