在 Oracle 中减去日期

Posted

技术标签:

【中文标题】在 Oracle 中减去日期【英文标题】:Subtracting Dates in Oralce 【发布时间】:2017-08-15 21:15:39 【问题描述】:

我正在尝试使用以下代码创建一个表。但是,我在将日期减去列之一时遇到了问题(是的,我已经尝试在网站上研究这个问题,但我仍然遇到问题)。

每当我运行此代码时,我都会收到以下错误:“需要 AM/A.M. 或 PM/P.M.”。 “AM”已经包含在内,所以我不确定我哪里出错了。有什么想法吗?

   CREATE TABLE FINAL
AS
    select 
        policy_id, 
        ECY, 
        TO_DATE(end_dt,'DD-MON-YY HH:MI:SS AM') - TO_DATE(start_dt,'DD-MON-YY HH:MI:SS AM') maxdays, 
        start_dt, 
        end_dt,
        cancellation_date,
        County
    from counttable
    where (Cancellation_Date is null or Cancellation_Date > &enddate)
    and ECY > 0;

提前感谢您的帮助。

【问题讨论】:

start_dtend_dt 列是什么数据类型?您的 enddate 变量定义为什么?您的会话的 NLS_DATE_FORMAT 是什么? (你为什么要在这个时间点创建一个表作为数据的快照;你真的想要一个视图吗? AM 不是格式,而是字符串。有一个特殊的关键字来处理 AM 和 PM。 你能显示一些数据吗? 还有cancellation_date是什么数据类型,&enddate是否包含引号? 【参考方案1】:

如果您的 start_dt 和 end_dt 确实是 VARCHAR 列,那么我敢打赌,您已经根据一个或多个行破坏了日期格式字符串

运行这两个查询,看看我的意思:

--works ok
select to_date('01-jan-1901 12:34 pm', 'dd-mon-yyyy hh:mi am') from dual

--complains "am/pm required"
select to_date('01-jan-1901 12:34:56 pm', 'dd-mon-yyyy hh:mi am') from dual

简而言之,它不是在抱怨“您的日期格式字符串缺少 AM/PM 字段”,而是在抱怨“在尝试将表格数据解析为您提供的格式时,我遇到了除“AM”或当您的日期格式字符串向我保证我会找到 AM/A.M./PM/P.M. 时,数据中的“PM””

例如,在我上面的测试查询中,“表”中的数据在时间结束时包含:56 秒,但我的日期格式字符串向 oracle 承诺它会尽快在数据中找到 AM/PM因为它已经完成了对分钟的解析。本质上,我的日期格式字符串在撒谎。

确保您的日期格式字符串准确地描述了您的字符串在表格的每一行中表示日期的方式。即使百万分之一的行包含一些违反格式的损坏数据,也会停止查询。这就是为什么最好将日期存储为 datetime 类型,而不是 varchar

如果您的列不是 VARCHAR,则在 TO_DATE() 开始工作之前,会进行一些到 varchar 的隐式转换。如果您的列已经是日期,则不要 TO_DATE 它们。如果它们不是 VARCHAR(例如它们是 1970 年 1 月 1 日午夜之后的分钟数的 INT),请相应地对待它们 --> 以它们的表示所需的任何方式将它们转换为日期

【讨论】:

以上是关于在 Oracle 中减去日期的主要内容,如果未能解决你的问题,请参考以下文章

如何在oracle中减去2个日期以获得小时和分钟的结果

oracle sql pl/sql 如何减去日期/工作周

oracle根据出生日期算年龄

oracle根据出生日期算年龄

Oracle功能优化

oracle 常用函数之 日期函数