Pular para o conteúdo
  • Este tópico contém 4 respostas, 3 vozes e foi atualizado pela última vez 1 ano, 3 meses atrás por Avatar de José Laurindo ChiappaJosé Laurindo Chiappa.
Visualizando 5 posts - 1 até 5 (de 5 do total)
  • Autor
    Posts
  • #162844
    Avatar de BarizonBarizon
    Participante

      Boa tarde!

      Boa tarde!
      Tenho uma tabela com um campo tent_recpdat (data de recebimento da mercadoria do tipo data (dd-mm-aaaa)), preciso fazer um select que me traga o resultado de recebimentos com mais de 50 dias, tentei o comando sql abaixo, mas sem resultados.

      select tent_fornece_1, tent_nomefor_1, tent_nronota_1, datedif(day, tent_recpdat_1, getdate()) as dif_dias from notent where dif_dias > 50

      #162871
      Avatar de MottaMotta
      Participante

        A dúvida ê Oracle (plsql) ou MySql ?
        Oracle

        Where tent_recpdat >= Trunc(sysdate-50)

        #162872
        Avatar de José Laurindo ChiappaJosé Laurindo Chiappa
        Moderador

          Blz, Barizon, tudo bem ? Espero que sim…. Então, muito embora a linguagem SQL em si seja (mais ou menos) padronizada, pelo menos nos aspectos mais básicos, as FUNÇÕES , os DATATYPES e as Funcionalidades e Conceitos são muito MUITO diferentes entre os diversos SGBDs que utilizam a linguagem SQL…..
          Então, JULGANDO pelo código que vc postou, essa query NÂO É de Oracle , pois essa built-in GETDATE ** não existe ** no Oracle (se usa SYSDATE no lugar), não existe datediff (pois o Oracle consegue fazer aritmética de datas, te dando o número de dias, naturalmente com os operadores de ADIÇÃO e de SUBTRAÇÂO…. Não tem jeito, só mesmo SQLs, o mais SIMPLES DO SIMPLES rodam sem diferenças ou quase isso em diferentes SGBDs…

          Isso posto, a sua resposta : SUPONDO que é de ORACLE a sua dúvida (já que estamos num fórum de Oracle), SUPONDO que ** REALMENTE ** o datatype dessa coluna tent_recpdat_1 é DATE mesmo (não é NEM DE LONGE boa prática, mas tá CHEIO de apps pelaí que guardam datas em colunas STRING, por exemplo), AO QUE ENTENDI primeiro vc queria cálcular E exibir o número de dias (e NÚMERO DE DIAS apenas, e NÂO dias, horas, minutos, etc) entre HOJE e a data contida nessa coluna (data essa que é SEMPRE NO PASSADO), no RDBMS Oracle ficaria assim :

          select tent_fornece_1, tent_nomefor_1, tent_nronota_1, TRUNC(SYSDATE – tent_recpdat_1) as dif_dias from notent ;

          ==> Muito bem…. Agora, além disso vc quer USAR essa coluna DIF_DIAS (que ** Não Existe ** na tabela, é uma coluna calculada FORA DO DATABASE pela query) como condição de filtro no WHERE, certo ? Num database controlado pelo RDBMS ORACLE, normalmente só é aceito no WHERE expressões que usem e/ou referenciem colunas que EXISTAM NO DATABASE, o que NÂO É o caso dessa DIF_DIAS…. A solução é SIMPLES, basta vc fazer um acesso EXTERNO, assim :

          SELECT *
          FROM (select tent_fornece_1, tent_nomefor_1, tent_nronota_1, TRUNC(SYSDATE – tent_recpdat_1) as dif_dias
          from notent
          )
          WHERE
          dif_dias > 50;

          ==> que aí vai beleza, sacou ??? Essas MÍNIMAS diferenças de funcionalidade, Conceito e built-ins não tem jeito, ABUNDAM entre diferentes SGBDs….

          #162874
          Avatar de BarizonBarizon
          Participante

            Bom dia Chiappa!

            Sim é Oracle, perfeita a sua explicação. Muito obrigado deu certo!

            #162974
            Avatar de José Laurindo ChiappaJosé Laurindo Chiappa
            Moderador

              Perfeito – e, MAIS IMPORTANTE do que ter conseguido escrever o SELECT para ESTE CASO ESPECÍFICO, é ter Aprendido os conceitos explicados, que aí vc já ganhou FERRAMENTAL pra usar nos PRÓXIMOS casos, blz ?

              Abraços,

              Chiappa

            Visualizando 5 posts - 1 até 5 (de 5 do total)
            • Você deve fazer login para responder a este tópico.
            plugins premium WordPress