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

时间:2017-12-10 21:42:07

标签: sql oracle

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

1.您可以输入日期,输入DATE类型的Test_Date,格式不包括时间吗? - > ' 30-APR-15' 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;

2 个答案:

答案 0 :(得分:2)

  

DATE,这种格式排除时间? - &GT; &#39; 30-APR-15&#39;
  ...
  DATE的格式为&#39; 30-Apr-15&#39;

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

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

您也可以使用日期文字,就像您以后一样。但同样地,DATE 1900-01-01仍然评估为date有时间 - 它是1900年1月1日的午夜。(还有一个时间戳文字,允许您提供时间。)< / p>

  

将DATE与SYSDATE进行比较时......是否需要考虑当前时间?是否考虑当前时间?

是的,它使用date值的时间 - 可能是午夜,但总是在那里 - 而sysdate

  

如果测试是在数据录入的同一天完成的,会出现错误吗?

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

插入必须指定未来日期或今天晚些时候的显式时间才能获得异常。或者当然是1900年以前的日期。

---

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

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

比较了今天早上Test_Date午夜时分的午夜。但是,从您提出的异常消息中,您无论如何都想要时间。

答案 1 :(得分:0)

在Oracle中,数据类型“日期”包含精确到一秒的日期和时间。因此,从技术上讲,你的第一个问题的答案是否,但是当你输入这样的日期mv时,组件的时间设置为00:00:00,那么该日期的全部值将是2015-04-30 00:00:00

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

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

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