none
QUERY Linq Duvidas RRS feed

  • Pergunta

  • Boa tarde pessoal. 

    Havia postado esta mesma duvida, ha alguns dias atras, que me foi respondida e prontamente. mas por erro meu não me aprofundei nos testes que deveria ter realizado. com isso descobri um comportamento no minimo estranho ao resultado.

    tenho 3 lançamentos na tbl_marca e deveria ter como resultado nesta consulta 3 resultados id_auto 1,3,4  mas o id-auto 1 não é carregado. 

    ja mudei os operadores mas o resultado não é o esperado.

    desde ja agradeço quem puder me ajudar.

    att ricardo.

    SELECT ta.IdAuto,ta.Marca,ta.Placa  from Tbl_Automovel as ta where not exists (SELECT * from Tbl_Marca as tm
                          where tm.id_carro = ta.IdAuto  and tm.DataM = '13/12/2019'  and  tm.HoraI <= '09:20:00' and  tm.HoraF <= '09:50:00'  );
    estou tentando inserir um jpg nessa pergunta mas não estou conseguindo. 
    segunda-feira, 30 de dezembro de 2019 16:55

Respostas

Todas as Respostas

  • Ricardo,

    As condições que você esta declarando no seu comando select são verdadeiras?

    Existe realmente o Id_Auto = 1 cadastrado no dia 13/12/2019? O mesmo encontra-se no intervalo de horas definido?

    Podemos fazer três cenários básicos, o primeiro é remover a condição as condições relacionadas com a Hora Inicial e Final:

    SELECT ta.IdAuto,ta.Marca,ta.Placa  from Tbl_Automovel as ta where not exists (SELECT * from Tbl_Marca as tm
                          where tm.id_carro = ta.IdAuto  and tm.DataM = '13/12/2019')
    Go

    Verifique se o dia ID_Auto = 1 aparece!

    O segundo cenário se relacionado com o formato da data e hora, você esta passando o formato da data em português, por padrão o SQL Server armazena e trata os valores de data, hora e dinheiro no idioma e formatação em inglês, ainda mais se o seu SQL Server estiver instalado em uma máquina com idioma em inglês, mas como você esta dizendo que o ID_Auto=1 não aparece e os outros sim, acabo descartando este cenário.

    O terceiro se relaciona com o operador Not Exists, não seria o caso de utilizar o operador Exist:

    SELECT ta.IdAuto,ta.Marca,ta.Placa  
    from Tbl_Automovel as ta 
    where Exists (SELECT * from Tbl_Marca as tm
                      where tm.id_carro = ta.IdAuto 
                      and tm.DataM = '13/12/2019' 
                      and  tm.HoraI <='09:20:00' and  tm.HoraF <= '09:50:00')

    Acredito que esta possa ser a solução, mantive nos dois exemplos de código o que você postou inicialmente, não fiz alterações.

    segunda-feira, 30 de dezembro de 2019 17:58
  • Deleted
    segunda-feira, 30 de dezembro de 2019 18:43
  • Ricardo,

    As condições que você esta declarando no seu comando select são verdadeiras?

    Existe realmente o Id_Auto = 1 cadastrado no dia 13/12/2019? O mesmo encontra-se no intervalo de horas definido?

    Podemos fazer três cenários básicos, o primeiro é remover a condição as condições relacionadas com a Hora Inicial e Final:

    SELECT ta.IdAuto,ta.Marca,ta.Placa  from Tbl_Automovel as ta where not exists (SELECT * from Tbl_Marca as tm
                          where tm.id_carro = ta.IdAuto  and tm.DataM = '13/12/2019')
    Go

    Verifique se o dia ID_Auto = 1 aparece!

    O segundo cenário se relacionado com o formato da data e hora, você esta passando o formato da data em português, por padrão o SQL Server armazena e trata os valores de data, hora e dinheiro no idioma e formatação em inglês, ainda mais se o seu SQL Server estiver instalado em uma máquina com idioma em inglês, mas como você esta dizendo que o ID_Auto=1 não aparece e os outros sim, acabo descartando este cenário.

    O terceiro se relaciona com o operador Not Exists, não seria o caso de utilizar o operador Exist:

    SELECT ta.IdAuto,ta.Marca,ta.Placa  
    from Tbl_Automovel as ta 
    where Exists (SELECT * from Tbl_Marca as tm
                      where tm.id_carro = ta.IdAuto 
                      and tm.DataM = '13/12/2019' 
                      and  tm.HoraI <='09:20:00' and  tm.HoraF <= '09:50:00')

    Acredito que esta possa ser a solução, mantive nos dois exemplos de código o que você postou inicialmente, não fiz alterações.



    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    segunda-feira, 30 de dezembro de 2019 18:43
  • Deleted
    segunda-feira, 30 de dezembro de 2019 19:14
  • Sobre a afirmação

     

     ela está errada.

    O SQL Server não armazena data, hora e dinheiro "no idioma e formatação em inglês". O formato de armazenamento desses tipos de dados é independente de idioma, e no caso de datas varia inclusive com o tipo de dados (datetime, datetime2 etc).

      


    José Diz     Belo Horizonte, MG - Brasil     [query performance tuning: Porto SQL]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    José,

    Com todo respeito, não vou entrar no mérito da minha afirmação, este é um conhecimento que eu aprendi em todas as minhas formações e certificações Microsoft passando por centro certificadores Ka-Solution e principalmente nos treinamentos internos da Microsoft, bem como, nós MVPs discutimos constantemente em nossas reuniões como podemos de uma forma mais simples tentar abordar este cenário.

    Alias, posso dizer tranquilamente, o que eu compartilhei aqui é fato e experiência do meu dia-a-dia nas minhas aulas e consultorias.

    Em relação a minha frase: "O segundo cenário se relacionado com o formato da data e hora, você esta passando o formato da data em português, por padrão o SQL Server armazena e trata os valores de data, hora e dinheiro no idioma e formatação em inglês, ainda mais se o seu SQL Server estiver instalado em uma máquina com idioma em inglês, mas como você esta dizendo que o ID_Auto=1 não aparece e os outros sim, acabo descartando este cenário." Mantenho o que estou colocando no post.

    Peço que faça um teste, monte um ambiente com o Windows ou Linux em português, instale o SQL Server, armazene os dados dos campos que você destacou. Qual será o formato e literal dos dados armazenados? Com certeza do sistema operacional. OK? Então, se for em inglês qual será o formato?

    Foi por isso que fiz a referência que o SQL Server armazena as datas e trata no formato em inglês ainda mais se o sistema operacional for o inglês, é justamente isso que estou destacando.

    Inclusive, isso é destacado na documentação oficial Microsoft: 

    https://docs.microsoft.com/en-us/sql/t-sql/data-types/date-transact-sql?view=sql-server-ver15

    Eis aqui outra abordagem similar ao que eu destaquei: https://pt.stackoverflow.com/questions/58521/como-saber-qual-formato-de-datetime-utilizado-em-determinada-coluna-do-sql-serve


    A qual foi obtida do StackOverFlow, o qual você participa.

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

    Pois bem, caro José Diz, talvez você não tenha entendido que no decorrer deste ano que esta sua maneira de agir, acabou refletindo na sua perda de moderação, alias, eu como todo respeito, integridade e conduta ética, continuo marcando e reconhecendo seus posts e contribuição, todavia, reconheço sua dedicação e trabalho com a comunidade Microsoft, ela é de grande avalia, principalmente seu conhecimento, eu mesmo aprendo muito com o que você compartilha aqui nos fóruns.

    Bom, para resumir, estou tentando de uma forma cordial e educada resolver "esta nossa rusga no decorrer de 2019" e deixar isso para traz, o ano de 2020 esta chegando. Caso contrário, serie obrigado, mesmo que eu venha a ter problemas em relação ao código de conduta Microsoft, a levar esta situação para uma esfera jurídica.

    Mais uma vez obrigado.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    segunda-feira, 30 de dezembro de 2019 20:03
  • Deleted
    segunda-feira, 30 de dezembro de 2019 20:38
  • José,

    Não estou confundindo, de forma alguma!

    Vamos em frente, continuaremos a contribuir da mesma forma e aprender com ambos.

    Abraços.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    segunda-feira, 30 de dezembro de 2019 20:40
  • Ola, Jose.

    Então vc havia me ajudado nessa mesma query. e eu erradamente havia lhe passado que estava correto o resultado, desculpa.

    1	WV	ABC-1234
    2	FIAT	ABC-4567
    3	AUDI	BCA-4321
    4	FORD	BCA-7654
    
    tbl_automovel
    SELECT [id_marcacao]
          ,[De]
          ,[Para]
          ,[Cliente]
          ,[DataM]
          ,[id_Motorista]
          ,[id_carro]
          ,[TempoViajem]
          ,[HoraI]
          ,[HoraF]
      FROM [dbo].[Tbl_Marca]
    GO
    
    
    1	RJ	SP	JOSE	2019-12-13	1	2	0.30	08:00:00.0000000	08:30:00.0000000
    2	SP	RJ	CARLOS	2019-12-13	1	2	0.45	08:30:00.0000000	09:45:00.0000000
    3	RJ	BH	ROBERTO	2019-12-13	2	1	0.20	09:00:00.0000000	09:20:00.0000000
    
    


    3	AUDI	BCA-4321
    4	FORD	BCA-7654

    acima esta o resultado da consulta com data 13/12/2019 e horai 09:20 horaf 09:50 nesse caso o ultimo registro da tbl_marca deveria aparecer no resultado. pois se encerra as 9:20 mesmo mudando para 09:25 a hora inicial ele não carrega. 

    Mais uma  vez obrigado pela paciência e ajuda.


    segunda-feira, 30 de dezembro de 2019 22:27
  • Oi junior. a principio achei que fosse os formatos de data, pois tive que instalar tudo num novo ssd. 

    mas não é isso. cheguei a trocar os operadores <= mas tanto pra HoraI e HoraF.

    a ideia seria ter o agendamento dos carros, assim teria como resultado a lita de carros liberados nas datas X em certo periodo. não sei se pensei nisso de forma muito simplória e o correto seria ter mais elementos ou uma consulta mais parruda. 

    postei os resultado acima.

    Mais uma vez agraço a ajuda.

    Att, ricardo.

    segunda-feira, 30 de dezembro de 2019 22:39
  • Ricardo,

    Tente passar desta forma os valores de data e hora na sua query:

    SELECT ta.IdAuto, ta.Marca, ta.Placa  
    From Tbl_Automovel as ta 
    Where Not Exists (SELECT * from Tbl_Marca as tm
                      Where tm.id_carro = ta.IdAuto  
                      And tm.DataM = '2019-12-13'  
                      And tm.HoraI <= '09:20:00.0000000' 
                      And  tm.HoraF <= '09:50:00.0000000')
    Se funcionar é um indicado que a maneira que os dados estão sendo armazenados não esta satisfazendo a maneira que você esta passando para buscar o mesmos em suas condições


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]


    segunda-feira, 30 de dezembro de 2019 22:46
  • Deleted
    segunda-feira, 30 de dezembro de 2019 22:58
  • oi jose. 

    Ao alterar o horário inicial (variável @dthji) para 9h21, o terceiro carro aparece.

    testei assim tb. mas ele não carrega. 

    segunda-feira, 30 de dezembro de 2019 23:05
  • Ricardo,

    Tomando com base que você esta utilizando o operador AND em suas condições, isso quer dizer que todas as condições devem ser verdadeiras para satisfazer o resultado, sendo assim, o que você esta mostrando para nós com o seu conjunto de resultado não é o que se reflete.

    Tente ao invés de utilizar o AND trocar por OR na condição relacionada a Hora Final:

    SELECT ta.IdAuto, ta.Marca, ta.Placa  
    From Tbl_Automovel as ta 
    Where Not Exists (SELECT * from Tbl_Marca as tm
                      Where tm.id_carro = ta.IdAuto  
                      And tm.DataM = '2019-12-13'  
                      Or tm.HoraI <= '09:20:00.0000000' 
                      Or tm.HoraF <= '09:50:00.0000000')

    Ou então, se basear somente na condição da Hora Final:

    SELECT ta.IdAuto, ta.Marca, ta.Placa  
    From Tbl_Automovel as ta 
    Where Not Exists (SELECT * from Tbl_Marca as tm
                      Where tm.id_carro = ta.IdAuto  
                      And tm.DataM = '2019-12-13'  
                      And  tm.HoraF <= '09:50:00.0000000')
    Não testei.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]



    segunda-feira, 30 de dezembro de 2019 23:06
  • Deleted
    segunda-feira, 30 de dezembro de 2019 23:10
  • oi junior, ja havia testado dessa forma. 

    o resultado é o mesmo.

    att ricardo.  

    segunda-feira, 30 de dezembro de 2019 23:11
  • Ricardo,

    Nem desta forma apelativa:

    SELECT ta.IdAuto, ta.Marca, ta.Placa  
    From Tbl_Automovel as ta 
    Where Not Exists (SELECT * from Tbl_Marca as tm
                      Where tm.id_carro = ta.IdAuto  
                      And tm.DataM = '2019-12-13'  
                      Or tm.HoraI <= '09:20:00.0000000' 
                      Or tm.HoraF <= '09:50:00.0000000')


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    segunda-feira, 30 de dezembro de 2019 23:24
  • este foi o original la do dia 13/12/2019

    --SELECT ta.IdAuto, ta.Marca,ta.Placa  from Tbl_Automovel as ta where not exists (SELECT * from Tbl_Marca as tm
      --                    where tm.id_carro = ta.IdAuto  and tm.DataM = '13/12/2019'  and tm.HoraI <= '09:20:00'  and '09:40:00' <= tm.HoraF);

    o que acabei postando anteriormente, foi que estava mudando a ordem de horai e horaf como não estava tento resultado parei e abri o forum para postar acabou que nem me atentei.

    se eu passar o valores diretos na query me tras o resultado errado. 

    SELECT ta.IdAuto,ta.Marca,ta.Placa  from Tbl_Automovel as ta where not exists (SELECT * from Tbl_Marca as tm
                          where tm.id_carro = ta.IdAuto  and tm.DataM = '13/12/2019'  and  tm.HoraI <= '09:21:00' and  '09:50:00' <=  tm.HoraF );
    
    resultado
    1	WV	ABC-1234
    2	FIAT	ABC-4567
    3	AUDI	BCA-4321
    4	FORD	BCA-7654

     

    segunda-feira, 30 de dezembro de 2019 23:26
  • oi junior dessa forma ele não carrega nada. 

    segunda-feira, 30 de dezembro de 2019 23:29
  • Ricardo,

    Nem desta forma, dividindo em partes:

    1 - Somente a condição Where:

    SELECT ta.IdAuto, ta.Marca, ta.Placa  
    From Tbl_Automovel as ta 
    Where Not Exists (SELECT * from Tbl_Marca as tm
                      Where tm.id_carro = ta.IdAuto)
    2 - Acrescentando o operador And na Data:
    SELECT ta.IdAuto, ta.Marca, ta.Placa  
    From Tbl_Automovel as ta 
    Where Not Exists (SELECT * from Tbl_Marca as tm
                      Where tm.id_carro = ta.IdAuto
                      And tm.DataM = '2019-12-13')  

    4 - Acrescentando o operador And na Hora Inicial:

    SELECT ta.IdAuto, ta.Marca, ta.Placa  
    From Tbl_Automovel as ta 
    Where Not Exists (SELECT * from Tbl_Marca as tm
                      Where tm.id_carro = ta.IdAuto
                      And tm.DataM = '2019-12-13'  
                      And tm.HoraI <= '09:20:00.0000000')

    4 - Adicionando o operador OR para Hora Final:

    SELECT ta.IdAuto, ta.Marca, ta.Placa  
    From Tbl_Automovel as ta 
    Where Not Exists (SELECT * from Tbl_Marca as tm
                      Where tm.id_carro = ta.IdAuto
                      And tm.DataM = '2019-12-13'  
                      And tm.HoraI <= '09:20:00.0000000'
                      Or tm.HoraF <= '09:50:00.0000000')

    Quais são os resultados?


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]



    segunda-feira, 30 de dezembro de 2019 23:30
  • oi junior dessa forma ele não carrega nada. 

    Ricardo,

    Desculpe o post anterior fui publicado errado, eu exclui, sem querer eu apertei Enter.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    segunda-feira, 30 de dezembro de 2019 23:31
  • Oi jose. 

    tanto no exemplo 1 quanto no 2 os resultado são iguais. quando passo com parâmetros, se inserir os dados direto na consulta ele retorna errado, no minimo por formatação , enfim. 

    para parar de te perturbar com essa questão. é possível que a consulta libere o carro quando a hora final seja igual a hora inicial? 

    Att, Ricardo.

     

    segunda-feira, 30 de dezembro de 2019 23:35
  • Deleted
    segunda-feira, 30 de dezembro de 2019 23:37
  • oi junior, 

    para 1/2/3

    3	AUDI	BCA-4321
    4	FORD	BCA-7654

    para o 4 é null não retorna nada. 

    segunda-feira, 30 de dezembro de 2019 23:41
  • Ricardo, os códigos #1 e #2 estão corretos. O que ocorre é que talvez você não tenha percebido mas a coluna tm.HoraI deve ser comparada com o horário final e a coluna tm.HoraF com o horário inicial. Nos seus códigos SQL sempre está ao contrário.

    O algoritmo utilizado no código #1 é um dos mais simples para encontrar horário disponível, sem sobreposição.

    segunda-feira, 30 de dezembro de 2019 23:55
  • Ricardo,

    Se para este Select:

    SELECT ta.IdAuto, ta.Marca, ta.Placa  
    From Tbl_Automovel as ta 
    Where Not Exists (SELECT * from Tbl_Marca as tm
                      Where tm.id_carro = ta.IdAuto)

    O ID_Auto=1 não aparece então o problema não esta direcionado aos valores de data e hora, mas sim a junção que você esta fazendo.

    Poderia nos mostrar qual é o resultado apresentando para este outro Select:

    Select ta.IdAuto, ta.Marca, ta.Placa 
    From TBL_Automavel Ta Left Join TBL_Marca TM
    			On Ta.IDAuto = TM.ID_Carro

    E este outro:

    Select ta.IdAuto, ta.Marca, ta.Placa, TM.DataM
    From TBL_Automavel Ta Left Join TBL_Marca TM
    			On Ta.IDAuto = TM.ID_Carro
    Where Year(TM.DataM) = 2019
    And Month (TM.DataM) = 12

    Não testei, valide e retorne os resultados.

    Sei que não é melhor forma, mas é um teste.



    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]


    terça-feira, 31 de dezembro de 2019 00:01
  • Deleted
    • Marcado como Resposta Ricardo SJ terça-feira, 31 de dezembro de 2019 00:18
    terça-feira, 31 de dezembro de 2019 00:03
  • realmente estava cometendo este erro. 

    ja mudei aqui rs.

    terça-feira, 31 de dezembro de 2019 00:09
  • testei aqui tirando o =. creio que agora a logica esteja correta.

    trouxe o carro 1. 

    não tinha me atendado para os fatores de horas que o inicial deveria comparar com o final. 

    José, muito obrigado mais uma vez pela ajuda e pela aula. 

    um grande abraço, e um feliz 2019. 

    terça-feira, 31 de dezembro de 2019 00:17
  • Deleted
    terça-feira, 31 de dezembro de 2019 00:27
  • kkkkk to ficando doido. claro para 2020. 
    terça-feira, 31 de dezembro de 2019 00:51
  • realmente estava cometendo este erro. 

    ja mudei aqui rs.

    Ricardo,

    Ai você me quebrou as pernas, eu também não havia percebido..... kkkkkkk

    Que bom que resolveu, abraços.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    terça-feira, 31 de dezembro de 2019 01:04
  • Deleted
    terça-feira, 11 de fevereiro de 2020 12:36