Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Comparando datas no Oracle SQL


31-DEC-95 não é uma string, nem 20-JUN-94 . São números com algumas coisas extras adicionadas no final. Deve ser '31-DEC-95' ou '20-JUN-94' - observe as aspas simples, ' . Isso permitirá que você faça uma comparação de strings.

No entanto, você não está fazendo uma comparação de strings; você está fazendo uma comparação de datas . Você deve transformar sua string em uma data. Ou usando o TO_DATE() integrado função ou um literal de data.

TO_DATE()

select employee_id
  from employee
 where employee_date_hired > to_date('31-DEC-95','DD-MON-YY')

Este método tem algumas armadilhas desnecessárias
  • Como a_horse_with_no_name observou nos comentários, DEC , não significa necessariamente dezembro. Depende do seu NLS_DATE_LANGUAGE e NLS_DATE_FORMAT definições. Para garantir que sua comparação funcione em qualquer localidade, você pode usar o modelo de formato de data e hora MM em vez disso
  • O ano de 95 é inexato. Você sabe que quer dizer 1995, mas e se fosse 50, é 1950 ou 2050? É sempre melhor ser explícito
select employee_id
  from employee
 where employee_date_hired > to_date('31-12-1995','DD-MM-YYYY')

Literais de data


Um literal de data faz parte do padrão ANSI, o que significa que você não precisa usar uma função específica do Oracle. Ao usar um literal, você deve especifique sua data no formato YYYY-MM-DD e você não pode incluir um elemento de tempo.
select employee_id
  from employee
 where employee_date_hired > date '1995-12-31'

Lembre-se de que o tipo de dados de data do Oracle inclui um elemento de hora, portanto, a data sem uma parte de hora é equivalente a 1995-12-31 00:00:00 .

Se você quiser incluir uma parte de tempo, precisará usar um literal de carimbo de data/hora, que tem o formato YYYY-MM-DD HH24:MI:SS[.FF0-9]
select employee_id
  from employee
 where employee_date_hired > timestamp '1995-12-31 12:31:02'

Mais informações


NLS_DATE_LANGUAGE é derivado de NLS_LANGUAGE e NLS_DATE_FORMAT é derivado de NLS_TERRITORY . Eles são definidos quando você criou o banco de dados inicialmente, mas podem ser alterados alterando seu arquivo de parâmetros de inicialização - somente se realmente necessário - ou no nível da sessão usando o ALTER SESSION sintaxe. Por exemplo:
alter session set nls_date_format = 'DD.MM.YYYY HH24:MI:SS';

Isso significa:
  • DD dia numérico do mês, 1 - 31
  • MM mês numérico do ano, 01 - 12 (janeiro é 01)
  • YYYY Ano de 4 dígitos - na minha opinião, isso é sempre melhor do que um ano de 2 dígitos YY pois não há confusão com o século ao qual você está se referindo.
  • HH24 hora do dia, 0 - 23
  • MI minuto da hora, 0 - 59
  • SS segundo do minuto, 0-59

Você pode descobrir suas configurações atuais de idioma e data consultando V$NLS_PARAMETERSs e a gama completa de valores válidos consultando V$NLS_VALID_VALUES .

Leitura adicional

  • Modelos de formato

Aliás, se você quiser que o count(*) você precisa agrupar por employee_id
select employee_id, count(*)
  from employee
 where employee_date_hired > date '1995-12-31'
 group by employee_id

Isso fornece a contagem por employee_id .