Página Inicial > SQL Server > Função TRUNC (data e hora) no SQL Server.

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
             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: , , ,
  1. Miranda
    26, fevereiro, 2010 em 15:13 | #1

    Prestem atenção que eu alterei a função, havia um erro nela e já corrigi.

  2. Miranda
    26, fevereiro, 2010 em 15:13 | #2

    Prestem atenção que eu alterei a função, havia um erro nela e já corrigi.

  3. Anderson Soares
    26, setembro, 2011 em 10:53 | #3

    Olá, muito boa a sua dica, também me deparei com uma situação parecida, achei uma dica muito interessante:

    http://sqlserverplanet.com/oracleequivalents/trunc-date-sql-server/

  4. Anderson Soares
    26, setembro, 2011 em 10:53 | #4

    Olá, muito boa a sua dica, também me deparei com uma situação parecida, achei uma dica muito interessante:

    http://sqlserverplanet.com/oracleequivalents/trunc-date-sql-server/

  1. Nenhum trackback ainda.
Você deve estar autenticado para enviar um coment´rio.