none
Diferença entre dadas RRS feed

  • Pergunta

  • Prezados,

    Eu utilizava o SQL Server 2000 por conta da base de dados estar locada em um servidor de mesmo perfil.

    Agora o servidor atualizou para o SQL 2008 e me complicou um pouco pois ainda não estou totalmente familiarizado com a nova versão...

    Peço ajuda na seguinte questão:

    Na minha consulta SQL tinha a seguinte linha:

    CAST

    (CAST(CONVERT(GETDATE() AS real(12,9))) - A.DATAINICIO AS int(12,9)) AS QTDDIAS

    No SQL 2000 funcionava perfeitamente, mas agora com o SQL 2008 dá este erro:

     

    CAST or CONVERT: invalid attributes specified for type 'real'.

    Ainda não consegui resolvê-lo. Podem me ajuar? O que devo fazer?

     

    Grato pela ajuda.

    sexta-feira, 28 de janeiro de 2011 13:32

Respostas

  • JPLima,

    Tanto no SQL Server 2000 como no 2008 este mesmo script funciona perfeitamente, posso dizer por experiência, o que esta acontecendo é um reconhecimento incorreto do tipo de dados que esta sendo convertido por parte do SQL Server.

    Importante destacar que no SQL Server 2000, 2005 ou 2008, quanto trabalhamos com valores do tipo decimais temos que utilizar os datatypes: Numeric, Float, Real.

    O Int é um datatype para números inteiros sem casas decimais, neste caso, não existe uma forma de converter valores do tipo data para valores decimais utilizando o datatype int, tem que trocar o datatype.

    Agora o mais correta para este tipo de cálculo seria utilizar função de Data e Hora existentes no SQL Server, como por exemplo: DateDiff, DatePart, no seu caso o DateDiff é o mais indicado, como o Marcelo salientou.


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]
    • Marcado como Resposta JPLima sexta-feira, 11 de fevereiro de 2011 12:44
    sábado, 29 de janeiro de 2011 13:41

Todas as Respostas

  • Olá!

     

    O que esta dando erro é o (12,9) no real, nunca trabalhei com SQL 2000, não sei o que ele quer dizer, no sql 2000, o (12,9) era para mostrar o dado de qual maneira?


    ---------------------------------------------- Para dicas SQL Server e mais -> www.onlywhatmatters.wordpress.com
    sexta-feira, 28 de janeiro de 2011 13:41
    Moderador
  • Jplima,

    INT(12,9) não existe.. inteiro é inteiro.. tente numeric(12,9)

    pelo seu script vc quer calcular diferença de dias.. o datediff é idal para isto... teste o seguinte:

    DATEDIFF(d,A.DATAINICIO,GETDATE())
    

    Att.
    Marcelo Fernandes


    MCP, MCDBA, MCSA, MCTS.
    Se útil, classifique!!!
    Me siga no twitter: @marcelodba

    sexta-feira, 28 de janeiro de 2011 16:44
  • JPLima,

    O tipo "REAL" não espera parâmetro algum.. você pode até passar UM parâmetro, mas ele não é obrigatório, e o resultado é o mesmo (veja abaixo). Já o FLOAT, usa esse UM parâmetro caso você queria, e ele é utilizado para algumas questões de storage. Agora, passar DOIS parâmetros, não pode!!!

    SELECT

     

    CONVERT(REAL, 50.12312313123123)

    SELECT

     

    CONVERT(REAL(1), 50.12312313123123)

    SELECT

     

    CONVERT(REAL(100), 50.12312313123123)

    SELECT

     

    CONVERT(REAL(8000), 50.12312313123123)

    SELECT

     

    CONVERT(REAL(38, 1), 50.12312313123123)

    -------------

    50.12312

     

    -------------

    50.12312

     

    -------------

    50.12312

     

    -------------

    50.12312


    -------------

    Msg 291, Level 16, State 1, Line 1

    CAST or CONVERT: invalid attributes specified for type 'real'


    http://raulsantosneto.wordpress.com
    sexta-feira, 28 de janeiro de 2011 19:29
  • JPLima,

    Tanto no SQL Server 2000 como no 2008 este mesmo script funciona perfeitamente, posso dizer por experiência, o que esta acontecendo é um reconhecimento incorreto do tipo de dados que esta sendo convertido por parte do SQL Server.

    Importante destacar que no SQL Server 2000, 2005 ou 2008, quanto trabalhamos com valores do tipo decimais temos que utilizar os datatypes: Numeric, Float, Real.

    O Int é um datatype para números inteiros sem casas decimais, neste caso, não existe uma forma de converter valores do tipo data para valores decimais utilizando o datatype int, tem que trocar o datatype.

    Agora o mais correta para este tipo de cálculo seria utilizar função de Data e Hora existentes no SQL Server, como por exemplo: DateDiff, DatePart, no seu caso o DateDiff é o mais indicado, como o Marcelo salientou.


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]
    • Marcado como Resposta JPLima sexta-feira, 11 de fevereiro de 2011 12:44
    sábado, 29 de janeiro de 2011 13:41
  • Junior,

    Muito obrigado pela dica. Eu não parei pra analisar o que a linha fazia... Estudando mais e vendo os posts aqui já saquei muita coisa que antes só fazia pq dava certo!! ;D

    Mas agora eu entendo porque dá certo ou pq não dá!

    Aos poucos vou alterando as linas que antes colocaram só pq deu certo pelas linhas lógicas certas, pois peguei este sistema pronto... Enfim sempre aprendendo mais!!

     

    Ah, grato pela ajuda de todos!!

     

    Fiquem na PAz de Deus!!

     

    Abraços!

    sexta-feira, 11 de fevereiro de 2011 12:51