【问题标题】:Date column as "YYYYMMDD" string - how to select all rows >= 30 days in the past?日期列为“YYYYMMDD”字符串 - 如何选择过去 >= 30 天的所有行?
【发布时间】:2016-06-24 10:45:18
【问题描述】:

我有一个表,其中包含一个 VALID_TO 列作为 VARCHAR2。此列包含格式为“YYYYMMDD”的日期字符串,例如“20160624”。

ID ARTICLE_NUMBER STORE_ID COUNTRY VALID_TO -------------------------------------------------- -------------- 100 111 22 AT 20160624 ...

我需要的是一个 SELECT,它可以为我提供所有具有 30 天或更早日期的 VALID_TO 日期的行。知道如何实现吗?

【问题讨论】:

  • 为什么将日期存储为字符串?至少您的格式使这种搜索变得简单,但仍然不是一个好主意。

标签: sql oracle date


【解决方案1】:

看起来很简单;找到 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...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-19
    • 1970-01-01
    • 2019-01-22
    • 2011-12-26
    • 1970-01-01
    • 1970-01-01
    • 2013-12-29
    • 1970-01-01
    相关资源
    最近更新 更多