Arquivo

Textos com Etiquetas ‘TRUNC’

Função TRUNC (data e hora) no SQL Server.

28, novembro, 2009 4 comentários

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
             S
ET @VALIDADE = CONVERT(NUMERIC, (SELECT VALORSTRING FROM PARAMETRO WHERE ID = ‘VALIDADE’))
             
BEGIN TRAN
              U
PDATE 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.

Categories: SQL Server Tags: , , ,
Social media & sharing icons powered by UltimatelySocial
WordPress Appliance - Powered by TurnKey Linux