我在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;
答案 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“日期数据类型”,请不要将其描述为“格式化”。
另一方面,如果您有涉及存储为字符串的日期信息的问题,请清楚说明。