Usuário com melhor resposta
Diferença entre dadas

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 QTDDIASNo 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.
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
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 -
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 FernandesMCP, MCDBA, MCSA, MCTS.
Se útil, classifique!!!
Me siga no twitter: @marcelodba -
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 1CAST or CONVERT: invalid attributes specified for type 'real'
http://raulsantosneto.wordpress.com -
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
-
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!