当前位置: 首页 > 面试题库 >

检查在varchar2中声明的有效日期

宰父淳
2023-03-14
问题内容

我的表如下所示,该表在VARCHAR2中声明:

YMD  
20101010  
20101112  
20100231  
20150101  
20160101

我必须检查有效日期并从sysdate过滤将来的日期,这些日期必须是有效格式。

我编写以下函数来检查有效日期:

create or replace FUNCTION VALIDATE_DATE (p_string in string) return date is  
begin  
    return to_date(p_string, 'YYYYMMDD');  
exception when others then  
    begin  
        return to_date(p_string, 'YYYY-MM-DD');  
    exception when others then  
        begin  
            return to_date(p_string, 'RR-MON-DD');  
        exception when others then  
            return null;  
        end;  
    end;  
end;

并编写了此查询来检查有效日期,并用null替换无效日期

select ymd, VALIDATE_DATE(ymd) as Valid 
from temp

并检查未来的日期,我写了以下查询,但是会引发错误

ORA-01839

select ymd 
from temp
where validate_date(ymd)='YES'
and to_date(ymd,'yyyymmdd')>sysdate

如何检查表格中将来的日期(如果存在)?


问题答案:

我宁愿将 设计问题 作为永久性修复,而不是将时间浪费在解决方法上。

首先, 永远不要DATE 存储为 VARCHAR2 。所有这些开销是由于您的 设计存在缺陷

‘20100231’

究竟怎么算是有效日期? 哪个日历在2月有31天?

跟着这些步骤:

  1. 添加一个具有DATE DATA TYPE的新列。
  2. 使用 TO_DATE 使用旧列中的日期值更新新列。
  3. 在新的DATE列上执行所需的DATE算术,或在第2步本身的UPDATE语句中进行处理。
  4. 删除旧列。
  5. 将新列重命名为旧列。

更新 添加演示

设置

SQL> CREATE TABLE t
  2      (ymd varchar2(8));

Table created.

SQL>
SQL> INSERT ALL
  2      INTO t (ymd)
  3           VALUES ('20101112')
  4      --INTO t (ymd)
  5      --     VALUES ('20100231')
  6      INTO t (ymd)
  7           VALUES ('20150101')
  8      INTO t (ymd)
  9           VALUES ('20160101')
 10  SELECT * FROM dual;

3 rows created.

SQL>
SQL> COMMIT;

Commit complete.

SQL>

添加新列:

SQL> ALTER TABLE t ADD (dt DATE);

Table altered.

SQL>

做所需的更新

SQL> UPDATE t
  2  SET dt =
  3    CASE
  4      WHEN to_date(ymd, 'YYYYMMDD') > SYSDATE
  5      THEN NULL
  6      ELSE to_date(ymd, 'YYYYMMDD')
  7    END;

3 rows updated.

SQL>
SQL> COMMIT;

Commit complete.

SQL>

让我们检查:

SQL> SELECT * FROM t;

YMD      DT
-------- ---------
20101112 12-NOV-10
20150101 01-JAN-15
20160101

SQL>

删除旧列:

SQL> ALTER TABLE t DROP COLUMN ymd;

Table altered.

SQL>

将新列重命名为旧列名

SQL> ALTER TABLE t RENAME COLUMN dt TO ymd;

Table altered.

SQL>

您已经解决了问题

SQL> SELECT * FROM t;

YMD
---------
12-NOV-10
01-JAN-15


SQL>


 类似资料:
  • 问题内容: 我很好奇,用Java 创建对象的最明显的方法已被弃用,并且似乎已被使用宽大日历的不太明显的方法“替代”。 如何检查以日,月和年的组合形式给出的日期是否为有效日期? 例如,2008-02-31(如yyyy-mm-dd)将是无效日期。 问题答案: 当前的方法是使用日历类。它具有setLenient方法,该方法将验证日期和引发异常,如果超出示例,则抛出异常。 忘记添加:如果您获得日历实例并使

  • 以下是场景: 我有一个日期和一个不同的日期格式。示例: 日期:2016-10-19 日期格式:“DD-MM-YYYY”。 我需要检查这个日期是否有效。 我尝试过跟踪事情 d.isValid()每次返回false。Moment.js解析给定格式的日期吗? 然后我尝试先在中格式化日期,然后将其传递给矩。js: 现在<代码>日期。isValid()给了我想要的结果,但现在是时候了。js日期对象创建两次。

  • 问题内容: 我正在构建一种日历Web应用程序 我已经在HTML中设置了以下表格 然后,来自用户的输入将被提交到小服务器中 我想知道,有没有办法检查用户输入的日期是否是有效日期? 显然,我可以编写很多if语句,但是是否有任何内置函数可以检查这一点? 谢谢 问题答案: 你可以尝试做 这将消除诸如> 12,小时> 23,不存在的leap日等问题(在不month年,month = 2的最大值为28,否则为

  • 问题内容: 我正在Linux中编写bash shell脚本,该程序将接受日期(mm-dd- yyyy)作为参数。我想知道是否有一种简单的方法来检查日期是否有效?有操作员,我可以使用测试进行检查吗? 问题答案: 您可以检查 因此是有效的,但是使用连字符(例如)对于无效。 您也可以使用单词:或都有效。

  • 问题内容: 在我的项目中,我需要检查日期字符串是否评估为正确的Date对象。我决定允许yyyy-MM- dd和Date格式[(年,月,日)和(年,月,日,时,分)。我如何检查它们是否有效?我的代码返回“ 1980-01-01”的null和一些奇怪的日期(例如3837.05.01),这些日期给出了用逗号分隔的字符串: 我记得我必须从年份中减去1900,但是我也看到月份不同,所以我想避免检查日期字符串

  • 问题内容: 检查URL在Java中是否有效的最佳方法是什么? 如果试着拨打和赶上,但它似乎很乐意与任何开头。 我不关心建立连接,只是有效性。有办法吗?Hibernate Validator中的注释?我应该使用正则表达式吗? 编辑:和 URL的一些示例。 问题答案: 考虑使用Apache Commons UrlValidator类 有几个属性,您可以设置来控制如何类的行为,在默认情况下,和被接受。