Enquanto:
tipo de campo de data começando com SQL Server 2008
Dada uma tabela:
CREATE TABLE dbo.MyTable
(
Code int NOT NULL,
DateCode datetime NOT NULL
)
CONSTRAINT [PK_MyTable] PRIMARY KEY CLUSTERED
(
[Code] ASC, [DateCode] DESC
);
Qual é a melhor maneira de RESTRINGIR que DateCode seja apenas uma data?
Deve permitir datas sem parte de tempo.
2017-01-02
2017-01-02 00:00:00.000
20170102
Até agora estou usando:
ALTER TABLE dbo.MyTable ADD CONSTRAINT [CHK_MyTable_DateCode]
CHECK ([DateCode] = DATEADD(DAY, 0, DATEDIFF(DAY, 0, [DateCode])));
Mas, gostaria de saber se existe uma maneira melhor/curta de realizá-lo.
Você pode simplificar um pouco, pois o SQL Server sabe
datetime
que pode tratar o valor como o número de dias desde 0. Prefiro usar'19000101'
mais de zero, pois é um pouco menos enigmático o que está acontecendo:No entanto, acho uma escolha estranha repreender os usuários que podem usar built-ins como
GETDATE()
ou parâmetros como@OrderDate
os quais eles não percebem que contém um componente de tempo. Portanto, uma maneira um pouco mais limpa de resolver isso seria com um gatilho:Usar um
INSTEAD OF
gatilho não é popular para algumas pessoas aqui, mas acho que é melhor massagear esses valores antes de inserir do que depois. O PK será tratado da mesma forma que sem um gatilho - as violações ainda serão capturadas no momento da inserção (com um gatilho posterior, no entanto, você não atingiria a violação até que o código do gatilho fosse executado, o que teoricamente pelo menos significa mais registro). Na verdade, você pode adicionar umGROUP BY
ao gatilho para ignorar silenciosamente duplicatas da instrução de origem, por exemploINSERT ... VALUES(1,GETDATE()), (1,CURRENT_TIMESTAMP);
.