0

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

客户订阅了一项服务,因此链接到具有结束日期的订阅。我想显示将在未来 2 周内结束的订阅列表。我没有设计数据库,但注意到 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:指定月份的日期无效”。任何帮助,将不胜感激..

4

3 回答 3

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}')
于 2013-02-07T09:18:46.783 回答
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
于 2013-02-07T09:23:55.100 回答
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() 函数,该函数接受一个字符串并对其应用许多不同的日期格式掩码,以期获得成功的转换。
于 2013-02-07T09:24:08.307 回答