- Este tópico contém 4 respostas, 3 vozes e foi atualizado pela última vez 1 ano, 10 meses atrás por José Laurindo Chiappa.
-
AutorPosts
-
23 de janeiro de 2023 às 3:48 pm #162844BarizonParticipante
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
23 de janeiro de 2023 às 9:15 pm #162871MottaParticipanteA dúvida ê Oracle (plsql) ou MySql ?
OracleWhere tent_recpdat >= Trunc(sysdate-50)
24 de janeiro de 2023 às 8:04 am #162872José Laurindo ChiappaModeradorBlz, 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….
24 de janeiro de 2023 às 9:32 am #162874BarizonParticipanteBom dia Chiappa!
Sim é Oracle, perfeita a sua explicação. Muito obrigado deu certo!
25 de janeiro de 2023 às 12:09 pm #162974José Laurindo ChiappaModeradorPerfeito – 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
-
AutorPosts
- Você deve fazer login para responder a este tópico.