【发布时间】:2016-06-24 10:45:18
【问题描述】:
我有一个表,其中包含一个 VALID_TO 列作为 VARCHAR2。此列包含格式为“YYYYMMDD”的日期字符串,例如“20160624”。
我需要的是一个 SELECT,它可以为我提供所有具有 30 天或更早日期的 VALID_TO 日期的行。知道如何实现吗?
【问题讨论】:
-
为什么将日期存储为字符串?至少您的格式使这种搜索变得简单,但仍然不是一个好主意。
我有一个表,其中包含一个 VALID_TO 列作为 VARCHAR2。此列包含格式为“YYYYMMDD”的日期字符串,例如“20160624”。
我需要的是一个 SELECT,它可以为我提供所有具有 30 天或更早日期的 VALID_TO 日期的行。知道如何实现吗?
【问题讨论】:
看起来很简单;找到 30 天前的日期,将其转换为相同的格式,并将其用于您的过滤器:
where valid_to <= to_char(sysdate - 30, 'YYYYMMDD')
使用 CTE 生成 40 个日期的简单演示:
with t42 (valid_to) as (
select to_char(trunc(sysdate) - level, 'YYYYMMDD') from dual connect by level <= 40
)
select valid_to
from t42
where valid_to <= to_char(sysdate - 30, 'YYYYMMDD');
VALID_TO
--------
20160525
20160524
20160523
20160522
20160521
20160520
20160519
20160518
20160517
20160516
20160515
11 rows selected
虽然您的存储格式使这种搜索成为可能,但最好将日期存储为实际日期而不是字符串。几乎没有阻止您在其中输入无效值,例如20161357...
【讨论】: