Oracle - where子句中的Date减法

时间:2013-02-07 09:16:01

标签: oracle date date-arithmetic operation

我正在试图弄清楚如何比较where子句中日期减法的结果。

客户订阅了服务,因此链接到具有结束日期的订阅。我想显示将在接下来的两周内结束的订阅列表。 我没有设计数据库,但注意到End_Date列类型是varchar而不是日期..我无法改变它。

我的问题如下: 如果我尝试使用此请求选择减法的结果:

SELECT(TO_DATE(s.end_date,'YYYY-MM-DD') - TRUNC(SYSDATE)) , s.name  
from SUBSCRIPTION s WHERE s.id_acces = 15 

这将有效,并告诉我订阅结束和当前日期之间的天数。

但是现在,如果我尝试在一个用于比较的子句中包含完全相同的请求:

SELECT s.name 
from SUBSCRIPTION S 
WHERE (TO_DATE(s.end_date,'YYYY-MM-DD') - TRUNC(SYSDATE))  between 0 and 16

我会收到错误:“ORA-01839:日期对指定月份无效”。 任何帮助将不胜感激..

3 个答案:

答案 0 :(得分:3)

在表格的某处,您的日期格式与YYYY-MM-DD不同。在第一个查询中,您检查某行(或一组行s.id_acces = 15),这可能没问题,但在第二行中您扫描所有表。

尝试使用类似

的内容查找这些行
select end_date from subscription 
 where not regexp_like(end_date, '[0-9]{4}-[0-9]{2}-[0-9]{2}')

答案 1 :(得分:2)

检查您的DD值(即:每月的某天)。该值必须介于1和月中的天数之间。

January - 1 to 31
February - 1 to 28 (1 to 29, if a leap year)
March - 1 to 31
April - 1 to 30
May - 1 to 31
June - 1 to 30
July - 1 to 31
August - 1 to 31
September - 1 to 30
October - 1 to 31
November - 1 to 30
December - 1 to 31

答案 2 :(得分:1)

  

“End_Date列类型是varchar而不是日期..我不能   改变这一点。“

如果您无法更改日期,则必须更改数据。您可以使用此功能识别恶意值:

create or replace check_date_format (p_str in varchar2) return varchar2
is
   d date;
begin
   d := to_date(p_str,'YYYY-MM-DD');
   return 'VALID';
exception
   when others then
     return 'INVALID';
end;

您可以在查询中使用此功能:

select sid, end_date
from SUBSCRIPTION 
where check_date_format(end_date) != 'VALID';

您的选择是:

  1. 修复数据,以便所有日期都采用相同的格式
  2. 修复数据并应用检查约束以强制执行将来的有效性
  3. 编写一个定制的MY_TO_DATE()函数,该函数接受一个字符串并为其添加许多不同的日期格式掩码,以期获得成功的转换。