none
Efetuar uma validação no campo tipo Datetime RRS feed

  • Pergunta

  • Prezados,

    Bom dia.

    Tenho uma tabela que preciso fazer uma validação (no momento insert / update) em um campo do tipo datetime. Este campo pode aceitar nulo, sendo assim, ao inserir ou modificar este campo preciso verificar se o valor é uma data válida (se não for preciso retornar um erro) e se for um valor em nulo inserir ou alterar.

    Para este caso seria melhor criar uma restrição ou gatilho?

    Poderiam me dar um exemplo?

    Att,
    Sandro Rassy
    rassy
    quarta-feira, 4 de novembro de 2009 13:34

Respostas

  • Olá Rassy,

    Você pode obter o resultado esperado através de um CHECK CONSTRAINT ou até mesmo de uma TRIGGER que faça essa verificação, porem seria mais interessante a criação de uma regra definida através de uma CHECK CONTRAINT.

    Segue script de acordo com o meu entendimento em relação a sua dúvida.

    -- CRIANDO TABELA TEMPORÁRIA

    CREATE TABLE #DataValida

          (

                Data DATETIME

                      CHECK(CAST(Data AS INT) >= CAST(GETDATE() AS INT))

          )

    GO

    -- DATA VÁLIDA

    INSERT INTO #DataValida

          VALUES(GETDATE())

    GO

    -- DATA INVÁLIDA

    INSERT INTO #DataValida

          VALUES('2009-10-02')

    GO

    -- DATA INVÁLIDA

    INSERT INTO #DataValida

          VALUES('2009-11-03')

    Caso tenha lhe ajudado não se esqueça de marca como útil, só assim ajudará a melhorar a qualidade do fórum.

    Heberton Melo
    MCP | MCTS em SQL Server 2008 | Projetista de Dados

    Blog: http://heberton-melo.spaces.live.com

    • Sugerido como Resposta Heberton Melo quarta-feira, 4 de novembro de 2009 14:26
    • Marcado como Resposta rassy quarta-feira, 4 de novembro de 2009 16:30
    quarta-feira, 4 de novembro de 2009 14:26

Todas as Respostas

  • Olá Rassy,

    Você pode obter o resultado esperado através de um CHECK CONSTRAINT ou até mesmo de uma TRIGGER que faça essa verificação, porem seria mais interessante a criação de uma regra definida através de uma CHECK CONTRAINT.

    Segue script de acordo com o meu entendimento em relação a sua dúvida.

    -- CRIANDO TABELA TEMPORÁRIA

    CREATE TABLE #DataValida

          (

                Data DATETIME

                      CHECK(CAST(Data AS INT) >= CAST(GETDATE() AS INT))

          )

    GO

    -- DATA VÁLIDA

    INSERT INTO #DataValida

          VALUES(GETDATE())

    GO

    -- DATA INVÁLIDA

    INSERT INTO #DataValida

          VALUES('2009-10-02')

    GO

    -- DATA INVÁLIDA

    INSERT INTO #DataValida

          VALUES('2009-11-03')

    Caso tenha lhe ajudado não se esqueça de marca como útil, só assim ajudará a melhorar a qualidade do fórum.

    Heberton Melo
    MCP | MCTS em SQL Server 2008 | Projetista de Dados

    Blog: http://heberton-melo.spaces.live.com

    • Sugerido como Resposta Heberton Melo quarta-feira, 4 de novembro de 2009 14:26
    • Marcado como Resposta rassy quarta-feira, 4 de novembro de 2009 16:30
    quarta-feira, 4 de novembro de 2009 14:26
  • Olá Rassy, Boa tarde

    Se em uma determinada tabela vc possui uma coluna q é do tipo DATETIME, automaticamente vc só vai conseguir inserir registro válidos ou seja, DATAS VÁLIDAS,
    caso vc tente inserir datas inválidas em uma coluna DATETIME ira retornar um error.

    segue exemplos aproveitando o script acima:

    USE tempdb
    GO
    
    -- CRIANDO TABELA TEMPORÁRIA
    CREATE TABLE #DataValida
    (
        ID   INT IDENTITY(1,1),
        Data DATETIME
    )
    
    GO
    -- DATA VÁLIDA
    INSERT INTO #DataValida  VALUES(GETDATE())
    
    GO
    -- CONSULTANDO A DATA VÁLIDA
    SELECT * FROM #DataValida
    
    GO
    -- TENTANDO INSERIR UMA DATA INVÁLIDA
    INSERT INTO #DataValida  VALUES('2009-13-02')
    
    GO
    -- TENTANDO ATUALIZAR UMA DATA VÁLIDA PARA UMA INVÁLIDA
    UPDATE #DataValida SET Data = '2009-13-02' WHERE ID = 1
    
    GO
    DROP TABLE #DataValida
    






    Se a minha ajuda lhe for útil não esqueça de classificar. Att. Leonardo Marcelino
    quarta-feira, 4 de novembro de 2009 16:30
  • Rassy,

    Por acaso a função IsDate não ajudaria?
    Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA
    quarta-feira, 4 de novembro de 2009 17:40
  • Olá Junior,

    Pelo que eu o entendi, ele  quer que sejam inseridas somente datas validas, ou seja, data essa que seja igual ou superior a data do dia na qual ocorreu o cadastro ou atualização.

    Porem existem outras formas de se obter essa regra, mas a função ISDATE() sempre retornará 1 se a data ou hora especificada for válida, caso contrario o SQL Server reportará 0, existem outras regras que devem ser seguida para que não seja retornado o valor 0, com isso, não significa que eu garanta a inserção ou atualização de datas com datas inferiores da data atual.

    Caso tenha lhe ajudado não se esqueça de marca como útil, só assim ajudará a melhorar a qualidade do fórum.

    Heberton Melo
    MCP | MCTS em SQL Server 2008 | Projetista de Dados


    Blog: http://heberton-melo.spaces.live.com

    quinta-feira, 5 de novembro de 2009 01:43