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 seuNLS_DATE_LANGUAGEeNLS_DATE_FORMATdefinições. Para garantir que sua comparação funcione em qualquer localidade, você pode usar o modelo de formato de data e horaMMem 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:
DDdia numérico do mês, 1 - 31MMmês numérico do ano, 01 - 12 (janeiro é 01)YYYYAno de 4 dígitos - na minha opinião, isso é sempre melhor do que um ano de 2 dígitosYYpois não há confusão com o século ao qual você está se referindo.HH24hora do dia, 0 - 23MIminuto da hora, 0 - 59SSsegundo 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 .