2010-09-29 80 views
2

在SqlServer 2005中我有一個TimeOfDay字段是varchar(5)的表。我只想將字段值限制爲有效時間(13:40,2:20)。這是我到目前爲止Sqlserver表時間字段約束

ALTER TABLE tbl ADD CONSTRAINT ck 
CHECK (TimeOfDay like '[1-2][0-9]:[0-9][0-9]') 

我想要約束,以允許第一個數字是可選的,但沒有太多的運氣。

+1

爲什麼不包含0呢? – 2010-09-29 16:19:31

+0

hrm好點。這樣人們不會輸入1:30,而認爲這意味着13:30。 – Kenoyer130 2010-09-29 16:42:49

回答

1

爲了禁止 「時代」 如29:99

ALTER TABLE tbl ADD CONSTRAINT ck 
CHECK (
TimeOfDay like '[0-9]:[0-5][0-9]' OR 
TimeOfDay like '1[0-9]:[0-5][0-9]' OR 
TimeOfDay like '2[0-3]:[0-5][0-9]' 
) 

你有沒有考慮過存儲爲datetime與日期部分設置爲1900 1月1日?

+0

存儲日期是非常難看的,因爲它沒有被使用。 – Kenoyer130 2010-09-29 16:43:16

+1

@ Kenoyer130 - 同意(這在SQL Server 2008中使用'time'數據類型更好),但是如果您需要排序或計算存儲在datetime中的時間差異使事情變得更容易。 – 2010-09-29 17:00:36

2
ALTER TABLE tbl ADD CONSTRAINT ck 
CHECK (
    (LEN(TimeOfDay) = 5 and TimeOfDay like '[1-2][0-9]:[0-9][0-9]') 
     or (LEN(TimeOfDay) = 4 and TimeOfDay like '[0-9]:[0-9][0-9]') 
) 
+0

+1包含'LEN()' – 2010-09-29 16:25:12

0
ALTER TABLE tbl ADD CONSTRAINT ck 
CHECK (
    TimeOfDay like '[1-2][0-9]:[0-9][0-9]' 
    OR TimeOfDay like '[0-9]:[0-9][0-9]' 
)