在 oracle SQL 中比较 DATE 和 SYSDATE 时,他们考虑时间吗?

Posted

技术标签:

【中文标题】在 oracle SQL 中比较 DATE 和 SYSDATE 时,他们考虑时间吗?【英文标题】:When comparing DATE with SYSDATE in oracle SQL, do they consider time? 【发布时间】:2017-12-10 21:42:07 【问题描述】:

我在 oracle sql Developer 上运行以下代码,我有两个问题。 (提前道歉,我只学sql)

1.你能在DATE类型的Test_Date中输入一个不包括时间的日期吗? -> '15 年 4 月 30 日' 2.比较DATE和SYSDATE时,DATE格式为'30-Apr-15',是否考虑当前时间?它是否考虑了当前时间?

问题是如果测试是在数据输入的同一天进行,那么会不会出错?

非常感谢!

BEGIN
IF( :NEW.Test_Date < DATE '1900-01-01' OR 
:NEW.Test_Date > SYSDATE )
THEN
RAISE_APPLICATION_ERROR ( -20001, 
'Test Date must be later than Jan 1, 1900 and earlier than time of data 
entry' );
END IF;
END;

【问题讨论】:

1.是的 (to_date('30-Apr-15', 'DD-Mon-YY'))。 2.是的 谢谢,所以如果在输入数据的同一天进行测试,会不会出错? 【参考方案1】:

DATE,这种格式不包括时间? -> '2015 年 4 月 30 日' ... DATE 的格式为“30-Apr-15”

date 存储在特定于 Oracle 的内部表示中。你实际上不可能有一个没有时间的约会。但是,如果您执行to_date('30-APR-15', 'DD-MON-RR'),那么由于您没有提供时间组件,它们默认为零 - 所以创建的date 实际上是当天的午夜。您可以使用to_char() 将其转换回字符串以进行验证。

最好使用 4 位数的年份,并避免月份名称/缩写和隐式转换,或者依赖 NLS serrings。如果可能,使用明确的格式模型进行显式转换。 (当然,您提供的字符串格式必须相同。)

您也可以使用日期文字,因为您稍后会这样做。但类似地,DATE 1900-01-01 仍然计算为带有时间的date - 这是 1900 年 1 月 1 日的午夜。(还有一个时间戳字面量也可以让您提供时间。)

比较 DATE 和 SYSDATE ... 是否考虑了当前时间?它是否考虑了当前时间?

是的,它使用来自date 值(可能是午夜,但始终存在)和sysdate 的时间。

如果在输入数据的同一天进行测试,会不会出错?

如果数据条目使用了日期文字或没有时间的日期字符串/格式,则列值将是指定日期的午夜 - 所以这取决于您使用的日期。如果插入使用今天的日期date '2017-12-10',那么它将是今天早上的午夜,早于sysdate,因此您不会引发异常。即使插入实际上使用了sysdate 本身也可以,因为它不会晚于自身。

插入必须指定未来日期或今天晚些时候的明确时间,才能获得异常。当然,也可以是 1900 年之前的日期。

——-

如果您想“忽略”时间,可以使用trunc() 函数。例如:

IF TRUNC(:NEW.Test_Date, 'DD') > TRUNC(SYSDATE, 'DD') THEN

比较Test_Date 的午夜和今天早上的午夜。但从您提出的异常消息来看,您确实无论如何都想花时间。

【讨论】:

【参考方案2】:

在 Oracle 中,数据类型“日期”确实包含精确到一秒的日期和时间。因此,从技术上讲,您的第一个问题的答案是否定的,但是,当您输入这样的日期 to_date('30-Apr-15','DD-Mon-YY') 时,时间组件设置为 00:00:00,因此该日期的完整值将是 2015-04-30 00: 00:00

在比较to_date('30-Apr-15','DD-Mon-YY')sysdate 的输入时,是否考虑了时间(一天)? 是。 sysdate 将当前日期和时间都返回到最接近的秒数,如上所述,如果输入未指定,输入值将设置为时间 00:00:00。


请注意,日期的存储方式没有“格式”(存储为数字集),因此它们根本不以人类可读的格式存储。如果您以 .... 的格式描述日期,则会感到困惑,因为这可能意味着您的“日期”存储为字符串。因此,如果您真的在讨论 Oracle 的“日期数据类型”,请不要将其描述为“格式”。

另一方面,如果您确实有涉及存储为字符串的日期信息的问题,请明确说明。

【讨论】:

以上是关于在 oracle SQL 中比较 DATE 和 SYSDATE 时,他们考虑时间吗?的主要内容,如果未能解决你的问题,请参考以下文章

oracle sql日期比较

Oracle两个日期类型字段怎么比较大小

oracle中date类型的数据怎么写sql语句

如何在不使用 to_date /to_char 函数的情况下比较 oracle sql 中的日期?

Oracle SQL Sysdate 无法与 nls_date_format='DD-MON-RR' 正确比较

在 Oracle SQL 中比较日期