2010-09-29 3 views
2

Dans SqlServer 2005, j'ai une table avec un champ TimeOfDay qui est un varchar (5). Je souhaite limiter la valeur du champ à des heures valides uniquement (13: 40,2: 20). Voilà ce que j'ai jusqu'à présentSqlserver Table Time contrainte de champ

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

Je veux la contrainte pour permettre le premier chiffre soit en option, mais ne pas avoir beaucoup de chance.

+1

Pourquoi ne pas inclure 0 à la place? –

+0

hrm bon point. De cette façon, les gens ne taperont pas 1h30 et penseront que cela signifie 13h30. – Kenoyer130

Répondre

1

Pour interdisez au "temps", comme 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]' 
) 

Avez-vous envisagé le stockage comme datetime avec la partie date fixée au 1 janvier 1900?

+0

en stockant la date est fugly car il n'est pas utilisé. – Kenoyer130

+1

@ Kenoyer130 - D'accord (c'est mieux dans SQL Server 2008 avec le type de données 'time') mais si vous avez besoin de trier ou d'élaborer des différences de temps, stocker dans datetime facilite les choses. –

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 pour inclure 'LEN()' –

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]' 
) 
Questions connexes