2009-07-13 224 views

回答

81

随着TO_CHAR:

select to_char(sysdate, 'YYYY') from dual; 

在您的例子,你可以使用类似:

BETWEEN trunc(sysdate, 'YEAR') 
    AND add_months(trunc(sysdate, 'YEAR'), 12)-1/24/60/60; 

的比较值,你要求什么:

select trunc(sysdate, 'YEAR') begin_year 
    , add_months(trunc(sysdate, 'YEAR'), 12)-1/24/60/60 last_second_year 
from dual; 

BEGIN_YEAR LAST_SECOND_YEAR 
----------- ---------------- 
01/01/2009 31/12/2009 
+0

谢谢,通过你的回答,我能够创建我需要的几个不同的查询的SQL! – 2009-07-16 13:04:19

+3

为了获得今年的最后一秒,从第二年开始减少一秒钟将适用于日期和可预测的时间戳,而不需要小数秒。如果最终得到时间戳和小数秒,那么某些值可能会在当年之内,并且在今年开始之间和明年年底之间> 1秒之间错过。跨不同精度的多个日期/时间类型工作,我推荐并更喜欢'start_of_this_year <= value_under_test和value_under_test <'start_of_next_year' – 2013-04-10 13:46:55

52

另一种选择是:

SELECT * 
    FROM TABLE 
WHERE EXTRACT(YEAR FROM date_field) = EXTRACT(YEAR FROM sysdate) 
+2

这与基于函数的索引相结合可以使查询速度更快。 – 2009-07-13 14:50:17

+1

基于函数的索引会在这里增加不必要的复杂性。为什么在使用简单索引时可以使用FBI? – jva 2009-07-13 15:06:23

+1

如果将一个函数(如EXTRACT)应用于该列(在Oracle 11g上进行测试),那么date_field上的简单索引将不会被使用 - 如果它确实会很好。然而,可以使用EXTRACT上的基于功能的索引(YEAR FROM date_field)。 – 2009-07-14 08:59:16

13

使用extract(datetime)功能,它很容易,操作简单。

它返回年,月,日,分,秒

例子:

select extract(year from sysdate) from dual; 
-5

要显示在Oracle的SQL

select sysdate from dual; 
0

当前系统日期还有一种选择是:

SELECT * FROM mytable 
WHERE TRUNC(mydate, 'YEAR') = TRUNC(SYSDATE, 'YEAR'); 
1

因为我们这样做是一个到死 - 你不必指定年份:

select * from demo 
where somedate between to_date('01/01 00:00:00', 'DD/MM HH24:MI:SS') 
       and  to_date('31/12 23:59:59', 'DD/MM HH24:MI:SS'); 

但是,如果要指定落在内的所有日期值由FerranB接受的答案更有意义本年度。

相关问题