2010-09-29 37 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]' 
)