在 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 时,他们考虑时间吗?的主要内容,如果未能解决你的问题,请参考以下文章
如何在不使用 to_date /to_char 函数的情况下比较 oracle sql 中的日期?