- Este tópico contém 8 respostas, 5 vozes e foi atualizado pela última vez 12 anos, 9 meses atrás por burga.
-
AutorPosts
-
28 de fevereiro de 2012 às 5:08 pm #102915drigoParticipante
Olaa,
Tenho a necessidade de obter um conjunto de registros que estão num intervalo de datas, mas todos os registros contidos no banco estão no intervalo de: 24/02/2012 à 28/02/2012. Usei o between conforme mostrado abaixo:
SELECT *
FROM
teste.auditoria audit
WHERE
audit.data BETWEEN TO_DATE(’24/02/2012′, ‘DD/MM/YYYY’) AND TO_DATE(’28/02/2012′,’DD/MM/YYYY’);Mas as datas do dia 28 não foram mostradas, devido a tal fato modifiquei o Select conforme mostrado abaixo:
SELECT *
FROM
teste.auditoria audit
WHERE
audit.data BETWEEN TO_DATE(’24/02/2012′, ‘DD/MM/YYYY’) AND TO_DATE(’28/02/2012′,’DD/MM/YYYY’) + 1;Depois da Adição do +1 os registros foram obtidos corretamente, segue abaixo algumas dúvidas:
1) Adicionar o +1 nessa situação é uma má prática ?
2) Como poderia resolver o respectivo problema sem utilizar o +1 ?
3) Porque o Between nao considera a data final ?
Atenciosamente.
Desde Já, Agradeço.
28 de fevereiro de 2012 às 5:12 pm #102916MaxSteelParticipanteDrigo,
o campo audit.data e composto de data ou data e hora?
28 de fevereiro de 2012 às 5:37 pm #102917drigoParticipanteOlaa,
É composto por data e hora.
Muito obrigado pela atenção.
28 de fevereiro de 2012 às 6:01 pm #102918burgaParticipanteOi drigo, do jeito que você fez está quase ok…
Quando você não coloca hora em uma data o oracle assume que a hora é igual a 00:00:00.
se as suas horas do dia 28 forem todas acime de 00:00:00 ele não trará.
Eu disse quase ok porque a cláusula BETWEEN é inclusiva, então supondo que no futuro exista um registro com data igual a 29/02/2012 00:00:00 (que é hoje à meia noite), esse registro também entraria na consulta.
Então você pode fazer assim:
WHERE
audit.data BETWEEN TO_DATE(’24/02/2012′, ‘DD/MM/YYYY’) AND TO_DATE(’28/02/2012 23:59:59′,’DD/MM/YYYY HH24:MI:SS’)28 de fevereiro de 2012 às 6:43 pm #102922MaxSteelParticipanteoutra coisa que você pode estar fazendo também e truncar a data que não não tenha hora.
WHERE
trunc(audit.data) BETWEEN TO_DATE(’24/02/2012′, ‘DD/MM/YYYY’) AND TO_DATE(’28/02/2012′,’DD/MM/YYYY’)28 de fevereiro de 2012 às 8:09 pm #102924burgaParticipante[quote=”MaxSteel”:29piky9b]outra coisa que você pode estar fazendo também e truncar a data que não não tenha hora.
WHERE
trunc(audit.data) BETWEEN TO_DATE(’24/02/2012′, ‘DD/MM/YYYY’) AND TO_DATE(’28/02/2012′,’DD/MM/YYYY’)[/quote]Também pode ser feito, só tem que tomar cuidado porque isso “mata” um suposto índice que existir na coluna. 🙂
28 de fevereiro de 2012 às 8:30 pm #102925rmanParticipante@burga
É possível criar índice sob função. Mas realmente se o índice for sob a coluna ele não será usado.
28 de fevereiro de 2012 às 10:28 pm #102927msantinoParticipanteUsando o to_date() na coluna também é uma opção:
...
WHERE TO_DATE(audit.data, 'DD/MM/YYYY') BETWEEN TO_DATE('24/02/2012', 'DD/MM/YYYY') AND TO_DATE('28/02/2012','DD/MM/YYYY')28 de fevereiro de 2012 às 11:10 pm #102929burgaParticipante[quote=”rman”:1pfv8oab]@burga
É possível criar índice sob função. Mas realmente se o índice for sob a coluna ele não será usado.[/quote]
Eu sei, e também faço uso deles, mas esse normalmente não é o caso, ainda mais no caso de campos date, por isso não disse nada… 🙂
-
AutorPosts
- Você deve fazer login para responder a este tópico.