如何检查输入日期是否在2个设定日期(最好是设定日期和当前日期)之间
我正在创建BOK表,并且希望AAR(年份)在1900年到当前年份之间(可以手动指定),注意我对此并不十分熟悉并且还在学习。使用Oracle SQL开发人员。
CREATE TABLE BOK
(
ISBN VARCHAR2(50),
TITTEL VARCHAR2(50),
UTGIVER VARCHAR2(50),
AAR DATE CHECK (AAR between'1900/01/01' AND '2017/01/01')
)
Error starting at line : 1 in command -
Error report -
ORA-01861: stringconstant doesnt match formatstring
01861. 00000 - "literal does not match format string"
*Cause: Literals in the input must be the same length as literals in
the format string (with the exception of leading whitespace). If the
"FX" modifier has been toggled on, the literal must match exactly,
with no extra whitespace.
*Action: Correct the format string to match the literal.
答案 0 :(得分:3)
您正在使用字符串指定日期值。这会导致数据库尝试将其转换为具有默认格式的日期,该日期失败,因为您的字符串与该格式不匹配。您可以更好地明确指定它,而不是依赖于此默认格式:
CREATE TABLE BOK
(
ISBN VARCHAR2(50),
TITTEL VARCHAR2(50),
UTGIVER VARCHAR2(50),
AAR DATE CHECK (AAR between TO_DATE('1900/01/01', 'yyyy/mm/dd') AND
TO_DATE('2017/01/01', 'yyyy/mm/dd'))
)
答案 1 :(得分:2)
使用date
前缀:
AAR DATE CHECK (AAR between date '1900-01-01' AND date '2017-01-01')
答案 2 :(得分:2)
与Gordon一样,我喜欢ANSI标准日期文字(对于没有时间组件的日期)。
但请注意""包含两个端点。如果您希望年份在1900年和当前年份之间,则条件应为
check (aar >= date '1900-01-01' and aar < date '2017-01-01')
请注意<= date '2016-12-31'
只有在保证aar
永远不会有时间组件(例如09:30:00
)的情况下才会起作用,但通常情况下这是一种不好的做法在这样的事情上。
虽然......你解释过&#34; aar&#34;意味着&#34;年。&#34;但它是DATE数据类型。那是什么 - 一个&#34; date&#34;要求始终是1月1日00:00:00?奇怪。
然后,你提到了SYSDATE。唉,SYSDATE在不同的调用中可能有不同的值,因此它(以及包含它们的任何其他类似函数或表达式)在检查约束中是非法的。检查条件应该是真或假,无论是谁检查,何时或何时。如果它是一个需求(例如,可能有一个&#34; date_created&#34;列,其中SYSDATE用于填充它,并且检查约束可以在表级别,两者之间)有很多方法可以解决这个问题。列)。