Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

rob.coutinho

Select com data da erro

Recommended Posts

Pessoal, seguinte. Em uma das tabelas do meu Banco de dados, um dos campos está no formato DateTime. Bom, o SQL em questão está na Locaweb, que por sua vez coloca como Collation padrão SQL_Latin1_General_CP850_CI_AI

.

 

Até ai td bem. Ou melhor, nada bem! Imaginemos que nesse campo datetime, um dos registros está com a seguinte data: 9/4/2007. Pois bem, quando eu visualizo esse registro no Query Analyser, essa data me aparece assim: 2007-09-04. Quando visualizo no Enterprise Manager ela me aparece assim: 04/09/2007.

 

Bom, aí vem um outro detalhe. No mesmo Enterprise Manager, se eu mudar o dia em questão, de 9 para 19, automaticamente a data passa a ser exibida no seguinte formato: 19/4/2007. Agora a pergunta:

 

Se o dia é igual o maior a 10, a data mostrada fica no formato dd/mm/aaaa. Se o dia é menor, a data é exibida no formato mm/dd/aaaa. Pq isso?

 

Outra coisa, voltemos a pensar na data armazenada como 4/9/2007 ou seja, mm/dd/aaaa. Se eu faço um select com uma data vindo de um objeto Calendar no formato mm/dd/aaaa, o SQL não me retorna nada. Porém, se eu faço o mesmo select, só que no formato dd/mm/aaaa, ele retorna o registro em questão!

 

Minha cabeça deu nó! Pq na prática vi que quando tenho no banco uma data como 4/9/2007, minha consulta só retorna o registro se eu fizer o select com a data no formato 9/4/2007. Porém, se a data do banco estiver como 19/4/2007, e tentar fazer uma consulta no formato 19/4/2007, o SQL simplesmente dá erro! Mas se eu volto a colocar no formato 4/19/2007 aí funciona!

 

Ou seja, a impressão que tive é que o mesmo campo DateTime, é visto de maneira diferente quando o dia, ou o mes da data inserira é menor que 10!? Vcs conseguiram me entender? Nâo sei se expliquei direito. Mas não sei como posso resolver isso!

 

Sinceridade, eu to mais perdido que cabelo em cabeça de careca com esse problema e espero que alguém possa me ajudar. Vlw

Compartilhar este post


Link para o post
Compartilhar em outros sites

data eh f*** msm

 

trabalho da seguinte maneira:

para update, insert ou inserir na base na unha, passo tudo no formato yyyy-MM-dd, nunca tive problemas

 

para consultas faço a formatação no próprio select ou então na aplicação

no select seria assim:

select convert(varchar(10),getdate(),103)

Compartilhar este post


Link para o post
Compartilhar em outros sites

data eh f*** msm

 

trabalho da seguinte maneira:

para update, insert ou inserir na base na unha, passo tudo no formato yyyy-MM-dd, nunca tive problemas

 

para consultas faço a formatação no próprio select ou então na aplicação

no select seria assim:

select convert(varchar(10),getdate(),103)

Acho que o eriva_br respondeu mto bem pois a data no formato yyyy-MM-dd é aceita pela maioria dos bancos de dados e ameniza um monte de problemas na hora de efetuar os updates e inserts.

 

Só completando caso deseje devolver a hora serparada da data use:

select convert(varchar(10),getdate(),108)
t+

Compartilhar este post


Link para o post
Compartilhar em outros sites

Galera, valeu pela ajuda. Mas como ficaria a seguinte string:

 

SELECT * FROM TABELA WHERE Left(Nome,1) = 'F' AND Nome like '%fran%' AND cpf = '5942098891' AND bairro = 'CATUMBI' AND cidade = 'SAO PAULO' AND uf = 'SP ' AND benef = '6990045' AND esp = '42' AND atendido = 'Não' AND agendadopara = '4/9/2007'

 

Lembrando que "agendadopara" é o campo datetime da minha tabela e "4/9/2007" é a data que o usuário escolhe através de um Calendar na página.

 

Usando a instrução Convert sugerida por vocês como eu faria essa string? Tentei mas não consegui fazer ela rodar. Lembrando que estou usando ASP.NET.

 

Abraços e vlw pela ajuda.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Galera, valeu pela ajuda. Mas como ficaria a seguinte string:

 

SELECT * FROM TABELA WHERE Left(Nome,1) = 'F' AND Nome like '%fran%' AND cpf = '5942098891' AND bairro = 'CATUMBI' AND cidade = 'SAO PAULO' AND uf = 'SP ' AND benef = '6990045' AND esp = '42' AND atendido = 'Não' AND agendadopara = '4/9/2007'

 

Lembrando que "agendadopara" é o campo datetime da minha tabela e "4/9/2007" é a data que o usuário escolhe através de um Calendar na página.

 

Usando a instrução Convert sugerida por vocês como eu faria essa string? Tentei mas não consegui fazer ela rodar. Lembrando que estou usando ASP.NET.

 

Abraços e vlw pela ajuda.

Camarada,

 

A instrução abaixo:

SELECT * FROM TABELA WHERE Left(Nome,1) = 'F' AND Nome like '%fran%' AND cpf = '5942098891' AND bairro = 'CATUMBI' AND cidade = 'SAO PAULO' AND uf = 'SP ' AND benef = '6990045' AND esp = '42' AND atendido = 'Não' AND agendadopara = '4/9/2007'
Est ok!

 

Esta retornando algum erro ou não esta retornando registro nenhum?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pozé, ela tá correta, mas não tá, entende? rsrs

 

Assim, eu coloquei em um dos registros o campo agendadopara do tipo datetime setado para a data 4/9/2007. Só que, se eu faço esse select ai, ele não me retorna nada. Porém, se eu faço o select com a data assim 9/4/2007, ele me retorna o tal registro!

 

Esse é o problema. A Locaweb, me informou que os Banco de Dados está no formato MM/dd/yyyy. Só que esse formato não funciona, quando o mes, ou o dia de uma data do campo agendadopara é menor que 10, entendeu?

 

Por ex, se eu coloco manutalmente lá em um dos registro uma data como 4/10/2007, e faço a consulta com o mesmo formato, ele me retorna. Porém, se a data é 4/9/2007, e faço a consulta no mesmo formato, ele já não me retorna. só me retorna se eu faço a consulta no formato 9/4/2007. Entendeu?

 

Essa data que uso pra consulta, como disse vem de um Calendar. O usuário escolhe a data, ela entra num TextBox, e eu tarto ela separadamente, sepero mes, dia e ano e depois concateno como quero. O meu grande problema é esse. Me parece que o SQL não entende que o formato é MM/dd/yyyy quando o mes ou o dia das datas tem 1 digito. Quando tem dois digitos ele retorna td quando faço a consulta no formato MM/dd/yyyy.

 

Loko né?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pozé, ela tá correta, mas não tá, entende? rsrs

 

Assim, eu coloquei em um dos registros o campo agendadopara do tipo datetime setado para a data 4/9/2007. Só que, se eu faço esse select ai, ele não me retorna nada. Porém, se eu faço o select com a data assim 9/4/2007, ele me retorna o tal registro!

 

Esse é o problema. A Locaweb, me informou que os Banco de Dados está no formato MM/dd/yyyy. Só que esse formato não funciona, quando o mes, ou o dia de uma data do campo agendadopara é menor que 10, entendeu?

 

Por ex, se eu coloco manutalmente lá em um dos registro uma data como 4/10/2007, e faço a consulta com o mesmo formato, ele me retorna. Porém, se a data é 4/9/2007, e faço a consulta no mesmo formato, ele já não me retorna. só me retorna se eu faço a consulta no formato 9/4/2007. Entendeu?

 

Essa data que uso pra consulta, como disse vem de um Calendar. O usuário escolhe a data, ela entra num TextBox, e eu tarto ela separadamente, sepero mes, dia e ano e depois concateno como quero. O meu grande problema é esse. Me parece que o SQL não entende que o formato é MM/dd/yyyy quando o mes ou o dia das datas tem 1 digito. Quando tem dois digitos ele retorna td quando faço a consulta no formato MM/dd/yyyy.

 

Loko né?

Agora entendi!! ahahahaha

 

você já tentou a data invertida YYYY/MM/DD acho que assim vai funcionar.

Como você disse que tem o campos ano, mês e dia separados você pderá concatená-los como quiser então inverta a data que acho que irá funcionar.

 

t+

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não deu certo. Olha como a string ficou e ela continua não retornando nada:

 

SELECT * FROM Tabela WHERE Left(Nome,1) = 'F' AND Nome like '%fran%' AND cpf = '5942098891' AND bairro = 'CATUMBI' AND cidade = 'SAO PAULO' AND uf = 'SP ' AND benef = '6990045' AND esp = '42' AND atendido = 'Não' AND agendadopara = '2007/4/9'

 

A única maneira que ele retorna o registro é fazendo essa consulta como 9/4/2007. Daí o registro apareçe.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não deu certo. Olha como a string ficou e ela continua não retornando nada:

 

SELECT * FROM Tabela WHERE Left(Nome,1) = 'F' AND Nome like '%fran%' AND cpf = '5942098891' AND bairro = 'CATUMBI' AND cidade = 'SAO PAULO' AND uf = 'SP ' AND benef = '6990045' AND esp = '42' AND atendido = 'Não' AND agendadopara = '2007/4/9'

 

A única maneira que ele retorna o registro é fazendo essa consulta como 9/4/2007. Daí o registro apareçe.

Só faça mais um teste.

 

Troque:

AND agendadopara = '2007/4/9'

 

Por:

AND agendadopara = '2007/04/09'

 

Para não deixarmos nenhuma opção sem ser testada.

 

t+

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sem chance amigo, o erro persiste. O registro só é retornado quando faço essa mesma consulta com o seguinte formato: 9/4/2007.

 

De outra maneira, o SQL não me retorna o registro. Acabei de fazer uma interação com a Locaweb, e eles já me informaram que o padrão do servidor do meu cliente é mm/dd/yyyy. Só não sei onde pq comigo não está funcionando. Em uma data como essa 4/9/2007 ou 04/09/2007 o SQL não entende de jeito nenhum que o infeliz do 09 e o dia e o 04 é o mes.

 

A questão máxima agora é:

 

Como fazer o infeliz do SQLServer entender que estou querendo e usando o formato mm/dd/aaaa?

Se ele mesmo tá configurado assim (segundo diz a locaweb) porque não consigo retornar um registro fazendo uma consulta nesse mesmo formato?

 

Realmente não sei. Tenho uma máxima nesse nosso mundo da programação e desenvolvimento, de que quando temos probelmas, sempre alguém já passou por ele, independente de ter resolvido ou não. Mas não vi até agora, em diversos lugares da net alguém com um problema parecido. Quero fazer uma mísera instrução de select, onde um dos registros está datado para dia 9 do mes 4 do ano de 2007 e não consigo nem a pau!

 

Parece brincadeira, mas a solução por enquanto é publicar a coisa pro meu cliente, sem a opção de filtro por data. Até resolver essa bucha, não posso deixar a coisa parada. Faze oq né!

 

De qq modo valeu pela força brother! Assim que eu conseguir resolver isso eu deixo um ok aqui explicando como esse verdadeiro pepino de itu foi descascado rsrs

 

Vlw

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sem chance amigo, o erro persiste. O registro só é retornado quando faço essa mesma consulta com o seguinte formato: 9/4/2007.

 

De outra maneira, o SQL não me retorna o registro. Acabei de fazer uma interação com a Locaweb, e eles já me informaram que o padrão do servidor do meu cliente é mm/dd/yyyy. Só não sei onde pq comigo não está funcionando. Em uma data como essa 4/9/2007 ou 04/09/2007 o SQL não entende de jeito nenhum que o infeliz do 09 e o dia e o 04 é o mes.

 

A questão máxima agora é:

 

Como fazer o infeliz do SQLServer entender que estou querendo e usando o formato mm/dd/aaaa?

Se ele mesmo tá configurado assim (segundo diz a locaweb) porque não consigo retornar um registro fazendo uma consulta nesse mesmo formato?

 

Realmente não sei. Tenho uma máxima nesse nosso mundo da programação e desenvolvimento, de que quando temos probelmas, sempre alguém já passou por ele, independente de ter resolvido ou não. Mas não vi até agora, em diversos lugares da net alguém com um problema parecido. Quero fazer uma mísera instrução de select, onde um dos registros está datado para dia 9 do mes 4 do ano de 2007 e não consigo nem a pau!

 

Parece brincadeira, mas a solução por enquanto é publicar a coisa pro meu cliente, sem a opção de filtro por data. Até resolver essa bucha, não posso deixar a coisa parada. Faze oq né!

 

De qq modo valeu pela força brother! Assim que eu conseguir resolver isso eu deixo um ok aqui explicando como esse verdadeiro pepino de itu foi descascado rsrs

 

Vlw

Bom návio que esta afundando atraca em qq porto! ahahahaha

 

Portanto estais afim de efetuar um último teste?

 

Se sim? Tente assim:

AND convert(agendadopara,Getdate(),111) = '2007/04/09'

 

Talvez a opção acima resolva seus problemas. Se não resolver passe a data no formato mm/dd/yyyy para o SQL. No ASP você poderá utilizar o formatdate(sua_data,"mm/dd/yyy") que ja fica formatada da maneira correta.

 

Agora execute a altração proposta acima e veja o que acontece.

 

t+

Compartilhar este post


Link para o post
Compartilhar em outros sites

E aê beleza?

 

Bom, a primeira opção que usa o convert deu esse erro:

 

Type agendadopara is not a defined system type

 

E a segunda opção dá erro na função DateTime, creio que ela não esteja disponível no ASP.NET, só no antigo ASP.

 

Meu navio atracou na primeira opção disponível ou seja, entregar sem filtro por data. Por enquanto é o mais racional de se fazer. rsrs

 

Vlw

Compartilhar este post


Link para o post
Compartilhar em outros sites

E aê beleza?

 

Bom, a primeira opção que usa o convert deu esse erro:

 

Type agendadopara is not a defined system type

 

E a segunda opção dá erro na função DateTime, creio que ela não esteja disponível no ASP.NET, só no antigo ASP.

 

Meu navio atracou na primeira opção disponível ou seja, entregar sem filtro por data. Por enquanto é o mais racional de se fazer. rsrs

 

Vlw

Camarada,

 

Passei o exemplo errado! Foi mal!

 

Tanta assim:

AND convert(agendadopara,111) = '2007/04/09'

 

Faça só mais este teste.

 

t+

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.