我想同時在檢查約束中使用(之間,和,或)條件。例如:
Alter table called_no add constraint called_no_chck
check ("call_time" between '01:00:00 AM' and '12:59:59 AM' or
between '01:00:00 PM' and '12:59:59 PM')
uj5u.com熱心網友回復:
您當然可以在單個檢查約束中使用多個條件。
你的嘗試失敗了,因為你寫了一個無效的條件。如果它在where查詢的子句中,或者在任何其他需要條件的地方,同樣的條件就會失敗。
檢查日期時間是否介于 A 和 B 或 C 和 D 之間的正確方法如下所示:
...check (call_time between A and B OR call_time between C and D)
^^^^^^^^^
您了解簡寫,即call_time在第二個 之前不要重復列名 ( ) between。我也明白。計算機沒有——它們不是人。OR必須出現在兩個條件之間。諸如between必須應用于某物的條件,并且您不能忽略該“某物”并期望計算機理解它與您已在另一個條件中使用的“某物”相同。
但是,您的情況還有其他錯誤。12:59:59 AM 是午夜過后大約一小時;這不是你似乎相信的中午后一小時左右。凌晨 1 點到 12:59:59(同一天)之間沒有任何時間,因為凌晨 1 點是在12:59:59之后。
也不清楚您的列的資料型別是什么。如果是date(幾乎肯定應該是這樣),則不能僅將其與字串進行比較(就像您的情況一樣)。而且,您不能簡單地將日期時間與只是一天中的時間進行比較。
但是,所有這些錯誤都超出了您提出的問題的范圍(即:您能否在約束中使用“復合”條件;答案再次是肯定的)。
uj5u.com熱心網友回復:
不要使用字串列。
如果您只想要一個沒有日期的時間,請使用一INTERVAL DAY(0) TO SECOND(0)列。
如果你想要一個精確到整秒(并且沒有時區)的日期時間列,那么使用一個DATE列(它總是包含年、月、日、小時、分鐘和秒的組件)。
使用這兩個選項中的任何一個,您都不需要CHECK約束,因為它不會接受無效時間。
如果要使用 12 小時制格式化值,則可以使用虛擬列。
CREATE TABLE table_name (
time INTERVAL DAY(0) TO SECOND(0),
datetime DATE,
formatted_time VARCHAR2(11)
GENERATED ALWAYS AS (TO_CHAR(DATE '1970-01-01' time, 'HH12:MI:SS AM')),
formatted_datetime VARCHAR2(11)
GENERATED ALWAYS AS (TO_CHAR(datetime, 'HH12:MI:SS AM'))
);
INSERT INTO table_name (time, datetime)
SELECT INTERVAL '00:12:34' HOUR TO SECOND, SYSDATE FROM DUAL UNION ALL
SELECT INTERVAL '12:34:56' HOUR TO SECOND, SYSDATE 0.5 FROM DUAL;
然后:
SELECT * FROM table_name;
輸出:
時間 約會時間 FORMATTED_TIME FORMATTED_DATETIME 0 00:12:34 2021-12-18 15:37:34 12:12:34 上午 下午 03:35:47 0 12:34:56 2021-12-19 03:37:34 下午 12:34:56 03:35:47 上午
如果您將其存盤在字串中(不要),那么是的,您可以在單個約束中使用多個條件:
CREATE TABLE table_name (
time VARCHAR2(11)
CHECK (
SUBSTR(time, 1, 2) BETWEEN '01' AND '12'
AND SUBSTR(time, 4, 2) BETWEEN '00' AND '59'
AND SUBSTR(time, 7, 2) BETWEEN '00' AND '59'
AND SUBSTR(time, 10, 2) IN ('AM', 'PM')
AND time LIKE '__:__:__ __'
)
);
或多個約束:
CREATE TABLE table_name (
time VARCHAR2(11)
CONSTRAINT invalid_hours CHECK (SUBSTR(time, 1, 2) BETWEEN '01' AND '12')
CONSTRAINT invalid_minutes CHECK (SUBSTR(time, 4, 2) BETWEEN '00' AND '59')
CONSTRAINT invalid_seconds CHECK (SUBSTR(time, 7, 2) BETWEEN '00' AND '59')
CONSTRAINT invalid_meridian CHECK (SUBSTR(time, 10, 2) IN ('AM', 'PM'))
CONSTRAINT invalid_format CHECK (time LIKE '__:__:__ __')
);
但是,當不允許輸入無效資料時,不實施所有這些約束并僅使用 anINTERVAL或 aDATE會容易得多。
db<>在這里擺弄
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/385703.html
標籤:甲骨文
上一篇:運算子<未定義引數型別LocalTime,java中的int
下一篇:用于傳播幀值的SQL視窗函式
