我正在试图弄清楚如何比较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:日期对指定月份无效”。 任何帮助将不胜感激..
答案 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';
您的选择是: