Comparar as datas no SQL do Oracle

Estou a tentar que mostre o número de empregados contratados depois de 20 de junho de 1994., Mas tenho um erro a dizer " JUN ' identificador inválido. Por favor, ajudem, obrigado!

Select employee_id, count(*)
From Employee
Where to_char(employee_date_hired, 'DD-MON-YY') > 31-DEC-95; 
 100
Author: user1336830, 2012-04-16

5 answers

31-DEC-95 não é uma corda, nem é. São números com algumas coisas extras no final. Este deve ser '31-DEC-95' ou '20-JUN-94' - anote a citação única, '. Isto permitir-lhe-á fazer uma comparação de cadeia de caracteres.

No entanto, não está a fazer uma comparação de cadeias de caracteres; está a fazer uma comparação de datas . Devias transformar o teu fio num encontro. Quer utilizando o incorporado TO_DATE() função, ou uma data literal .

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 anotado nos comentários, DEC, não significa necessariamente dezembro. Depende da sua NLS_DATE_LANGUAGE e NLS_DATE_FORMAT configuração. Para garantir que a sua comparação com o trabalho em qualquer local, você pode usar o modelo de formato de datetime MM em vez disso
  • O ano de 95 é inexacto. Sabes que queres dizer 1995, mas e se foi em 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 não tens de usar uma função específica do Oráculo. Ao usar um literal você deve indicar a sua data no formato YYYY-MM-DD e não pode incluir um elemento de tempo.

select employee_id
  from employee
 where employee_date_hired > date '1995-12-31'

Lembre-se que o datatype Data Oracle inclui um elemento de tempo, por isso a data sem uma porção de tempo é equivalente a 1995-12-31 00:00:00.

Se quiseres para incluir uma porção de tempo, então você teria que usar um literal timestamp, que toma 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'

Outras informações

NLS_DATE_LANGUAGE é derivado a partir de NLS_LANGUAGE e NLS_DATE_FORMAT é derivado a partir de NLS_TERRITORY. Estes são definidos quando você criou inicialmente o banco de dados, mas eles podem ser alterados, alterando o seu arquivo de Parâmetros de inialização-apenas se realmente necessário - ou no nível de sessão, usando o ALTER SESSION sintaxe. Para instância:

alter session set nls_date_format = 'DD.MM.YYYY HH24:MI:SS';

Isto significa:

  • DD dia numérico do mês, 1-31
  • MM mês numérico do ano, 01 - 12 (Janeiro é 01)
  • YYYY 4 dígitos por ano - na minha opinião isto é Sempre melhor do que um ano de 2 dígitos YY Porque não há confusão com que Século 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 a sua linguagem actual e a configuração da linguagem de datas, questionando V$NLS_PARAMETERSs e o gamute completo dos valores válidos, questionando V$NLS_VALID_VALUES.

Leitura adicional


A propósito, se quer o count(*) tem de se agrupar por employee_id
select employee_id, count(*)
  from employee
 where employee_date_hired > date '1995-12-31'
 group by employee_id
Isto dá-te a contagem. employee_id.
 231
Author: Ben, 2016-06-07 12:43:03

Conclusão,

to_char funciona à sua maneira. Então,

Utilize sempre este formato AAAA-MM-DD para comparação em vez de MM-DD-AA ou DD-MM-AAAA ou qualquer outro formato

 3
Author: akshay gulawane, 2014-11-11 12:23:58

Pode usar o trunc e o to_ date da seguinte forma:

select TO_CHAR (g.FECHA, 'DD-MM-YYYY HH24:MI:SS') fecha_salida, g.NUMERO_GUIA, g.BOD_ORIGEN, g.TIPO_GUIA, dg.DOC_NUMERO, dg.* 
from ils_det_guia dg, ils_guia g
where dg.NUMERO_GUIA = g.NUMERO_GUIA and dg.TIPO_GUIA = g.TIPO_GUIA and dg.BOD_ORIGEN = g.BOD_ORIGEN
and dg.LAB_CODIGO = 56 
and trunc(g.FECHA) > to_date('01/02/15','DD/MM/YY')
order by g.FECHA;
 3
Author: Giovanny Farto M., 2015-02-03 22:24:13

Da tua pergunta:

Select employee_id, count(*) From Employee 
Where to_char(employee_date_hired, 'DD-MON-YY') > '31-DEC-95' 
Acho que não é para mostrar o número de empregados contratados depois de 20 de junho de 1994. se você quiser mostrar o número de funcionários, você pode usar:
Select count(*) From Employee 
Where to_char(employee_date_hired, 'YYYMMMDDD') > 19940620 

Acho que, para as melhores práticas, é preciso comparar as datas que pode usar:

employee_date_hired > TO_DATE('20-06-1994', 'DD-MM-YYYY');
or
to_char(employee_date_hired, 'YYYMMMDDD') > 19940620;
 2
Author: viduka, 2015-12-03 09:18:51

Uma citação deve estar lá, desde a data convertida para o carácter.

Select employee_id, count(*)
From Employee
Where to_char(employee_date_hired, 'DD-MON-YY') > '31-DEC-95';
 -4
Author: MVB, 2014-06-19 06:44:09