Função TRUNC (data e hora) no SQL Server.
Caros,
Estava ajustando um módulo de classificados em um sistema, quando me deparei com um obstáculo. O cliente quer que os anúncios dos classificados expirem automaticamente após um determinado número de dias, para isso criei uma stored procedure que faz um select e um update no banco, segue abaixo o trecho:
DECLARE
@VALIDADE NUMERIC(1)
BEGIN
SET @VALIDADE = CONVERT(NUMERIC, (SELECT VALORSTRING FROM PARAMETRO WHERE ID = ‘VALIDADE’))
BEGIN TRAN
UPDATE CLASSIFICADO SET STATUS = ‘E’ WHERE DATAHORA <= DATEADD(D, @VALIDADE * – 1, GETDATE()) AND STATUS <> ‘E’
IF @@ERROR = 0 COMMIT TRAN ELSE ROLLBACK TRAN
Quando fui verificar se havia dado certo, qual não foi a minha surpresa, a validade para teste era de 2 dias, então ele fez o update em todos os registros até as 19h de antes de ontem, pois eu rodei a stored procedure as 19h, ou seja ele checou a hora completa, e essa não era a intenção.
Como eu também trabalho com Oracle, me lembrei da função TRUNC([valordata]) que tem no PL-SQL, então me lembrei que nunca tinha utilizado isso no SQL Server, e fui procurar no São Google, encontrei diversos perdidos com o mesmo problema e somente uma resposta, não achei muito atraente, mas foi a única que eu encontrei, então segue abaixo:
Utilize a função CONVERT(tipo, valor).
CONVERT(NUMBER, GETDATE()) –> isso vai retornar o número de dias desde 01/01/1900, o “NUMBER” deve estar sem definição mesmo, pois assim ele retorna um valor inteiro, então basta compará-lo com a data do registro, assim:
CONVERT (NUMERIC, DATAHORA) <= CONVERT(NUMERIC, DATEADD(d, @VALIDADE * –1, GETDATE()))
Quem não quiser utilizar essa adaptação técnica (gambiarra) pode criar uma função no banco:
CREATE FUNCTION TRUNC(
@DATA DATETIME
) RETURNS DATETIME
AS
BEGIN
SET @DATA = CONVERT(DATETIME, FLOOR(CONVERT(NUMERIC(18,6), @DATA)))
RETURN @DATA
END
GO
Quem tiver sugestões ou idéia melhor, sinta-se em casa, faça seu comentário.
Encontrei também um site que ajuda nas diferenças entre os dois bancos:
http://www.dba-oracle.com/oracle_news/2005_12_16_sql_syntax_differences.htm
[]´s
Miranda.