检查当前日期是否在两个日期之间 Oracle SQL

57

我希望通过Oracle SQL,在2个日期之间选择1,如果当前日期在这些日期之间。

在阅读其他问题后,我编写了一段SQL:

https://dev59.com/X3E95IYBdhLWcg3wSsGD

https://dev59.com/NnE95IYBdhLWcg3wPbZ7

但它仅返回空值。sysdate是当前日期,格式为DD/MM/YYYY,即01/05/2014

我编写的SQL如下:

select 1 from dual 
WHERE to_date(sysdate,'DD/MM/YYYY') 
BETWEEN TO_DATE('28/02/2014', 'DD/MM/YYYY')
AND TO_DATE('20/06/2014', 'DD/MM/YYYY');
select 1 from dual 
WHERE to_date(sysdate,'DD/MM/YYYY') >= TO_DATE('28/02/2014', 'DD/MM/YYYY') 
AND to_date(sysdate,'DD/MM/YYYY') < TO_DATE('20/06/2014', 'DD/MM/YYYY'); 

1
您是否需要使用 TO_DATE() 函数来处理系统时间?实际上,系统时间本身就是一个日期。 - paul
感谢 Paul。根据下面 Gordon Linoff 的解决方案,sysdate 已经是一个日期。 - Avinesh Kumar
3
不需要使用SQL - 在PL/SQL中,您只需执行类似于if sysdate between date '2014-02-28' and date '2014-06-21' then v := 1; end if;的操作即可。请注意保持原意,使语言更加通俗易懂。 - Jeffrey Kemp
感谢 Jeffrey Kemp 这对我也很有效。 - Avinesh Kumar
4个回答

94

你不需要对sysdate应用to_date()。因为它已经存在。

select 1
from dual 
WHERE sysdate BETWEEN TO_DATE('28/02/2014', 'DD/MM/YYYY') AND TO_DATE('20/06/2014', 'DD/MM/YYYY');

如果您关心日期中的时间部分,则使用 trunc()

select 1
from dual 
WHERE trunc(sysdate) BETWEEN TO_DATE('28/02/2014', 'DD/MM/YYYY') AND
                             TO_DATE('20/06/2014', 'DD/MM/YYYY');

3
在这个例子(dual表)中,使用trunc(sysdate)可以处理日期的时间部分,但在具有索引的DATE字段的实际表中,它可能会阻止Oracle使用相应的索引。我建议不要使用"between"子句,而是使用比较运算符:where DATE_FIELD >= TO_DATE('28/02/2014', 'DD/MM/YYYY') and DATE_FIELD < TO_DATE('20/06/2014', 'DD/MM/YYYY') + 1 - anilech
另一种处理索引的方法来自于http://www.dba-oracle.com/t_sql_display_all_days_between_two_dates.htm: select ... where trunc(ORDER_DATE) between ... 注意:使用trunc函数将使order_date上的索引无效,您可能需要在trunc(order_date)上创建一个临时函数索引。 - Aba
@Aba...我有什么遗漏吗?这个问题中没有order_date,也没有在dual上的索引。 - Gordon Linoff
@GordonLinoff 我只是在评论anilech提出的问题,即在处理真实表时,trunc()和索引的问题。 - Aba

3
SELECT to_char(emp_login_date,'DD-MON-YYYY HH24:MI:SS'),A.* 
FROM emp_log A
WHERE emp_login_date BETWEEN to_date(to_char('21-MAY-2015 11:50:14'),'DD-MON-YYYY HH24:MI:SS')
AND
to_date(to_char('22-MAY-2015 17:56:52'),'DD-MON-YYYY HH24:MI:SS') 
ORDER BY emp_login_date

3
通常情况下,如果答案包含代码意图的解释以及为什么这样做可以解决问题而不会引入其他问题,那么这种答案会更有帮助。至少一个用户标记了此帖子,可能是因为他们认为没有解释的答案应该被删除。 - Nathan Tuggy
这个非常好用。只需要理解如何使用to_date进行格式化即可。 - Abhishek

0
在Oracle中使用以下代码:
select * from table_name where date_column_name between to_date('1-OCT-22') and ('31-OCT-22')

附注:请相应地更换表名和日期列名并进行格式调整


0

TSQL: 日期 - 需要查找两个日期之间的日期间隔

select
distinct
e1.enddate,
e3.startdate,
DATEDIFF(DAY,e1.enddate,e3.startdate)-1 as [Datediff]
from #temp e1 
   join #temp e3 on e1.enddate < e3.startdate          
       /* Finds the next start Time */
and e3.startdate = (select min(startdate) from #temp e5
where e5.startdate > e1.enddate)
and not exists (select *  /* Eliminates e1 rows if it is overlapped */
from #temp e5 
where e5.startdate < e1.enddate and e5.enddate > e1.enddate);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接