PL / SQL中的日期范围

时间:2010-09-08 05:57:05

标签: sql plsql

如果我有一个名为created_date的日期列(日期字段)的表,其值为“9/2/2010 5:25:42 PM”。

我想选择从start_dateend_date的所有行。但是,end_date可能是null。在这种情况下,我想选择created_date大于end_date的所有行。

6 个答案:

答案 0 :(得分:9)

由于toDate(可以为null)是一个宿主变量,它比已经给出的解决方案更容易(在这方面都是错误的,顺便说一下)

select * from mytable
  where created_date between v_fromdate
                         and nvl(v_todate, to_date('31.12.9999','dd.mm.yyyy'));

答案 1 :(得分:0)

为什么只使用一个简单的SQL查询,如下所示:

select xxx from table_names where created_date is null or (created_date >= to_date("02/09/2010", "dd/mm/yyyy") and created_date <= to_date("03/09/2010", "dd/mm/yyyy"));

修改

您可以定义一个类似 ammoQ 定义的查询,例如:

select xxx from table_names where created_date is null or created_date >= start_date and created_date <= nvl(end_date, to_date("31/12/9999", "dd/mm/yyyy"));

但是,当您使用PL / SQL时,可以检查end_date参数的可为空性:

IF end_date IS NULL THEN
    select xxx from table_names where created_date is null or created_date >= start_date;
ELSIF
    select xxx from table_names where created_date is null or created_date >= start_date and created_date <= end_date;
END IF;

请注意,如果created_date is null不是可以为空的列,则可以删除created_date条件...

答案 2 :(得分:0)

如果我从你的问题中解决了问题 这应该有效:

SELECT *
FROM yourTable
WHERE created_date >= to_date('01.09.2010', 'dd.mm.yyyy')
  AND (end_date  <= to_date('02.09.2010', 'dd.mm.yyyy')
  OR end_date   IS NULL);

答案 3 :(得分:0)

选择* 来自表
其中created_date&gt; ='2010-09-02'
和(created_date为NULL或created_date&lt; ='2010-09-03')

答案 4 :(得分:0)

select * from yourtable
where created_date >= @StartDate AND created_date <=ISNULL(@EndDate,created_date)

答案 5 :(得分:0)

SELECT *
  FROM A_TABLE
  WHERE CREATED_DATE >= &START_DATE AND
        (CREATED_DATE <= &END_DATE OR
         &END_DATE IS NULL)