Estou tentando fazer com que ele mostre o número de funcionários contratados após 20 de junho de 1994, mas recebo um erro dizendo "Identificador inválido de JUN". Por favor, ajude, obrigado!
Select employee_id, count(*)
From Employee
Where to_char(employee_date_hired, 'DD-MON-YY') > 31-DEC-95;
> <
ouBETWEEN '' AND ''
Respostas:
31-DEC-95
não é uma corda, 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 cadeias.No entanto, você não está fazendo uma comparação de cadeias; você está fazendo uma comparação de datas . Você deve transformar sua string em uma data. Ou usando a
TO_DATE()
função interna ou um literal de data .ATÉ A PRESENTE DATA()
Este método tem algumas armadilhas desnecessárias
DEC
não significa necessariamente dezembro. Depende das suas configuraçõesNLS_DATE_LANGUAGE
eNLS_DATE_FORMAT
. Para garantir que a sua comparação com o trabalho em qualquer local que você pode usar o modelo de formato de data e horaMM
em vezLiterais 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 especificar sua data no formato
YYYY-MM-DD
e não pode incluir um elemento de hora.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ê deseja incluir uma parte do tempo, precisará usar um literal de carimbo de data / hora, que assume o formato
YYYY-MM-DD HH24:MI:SS[.FF0-9]
Outras informações
NLS_DATE_LANGUAGE
é derivado deNLS_LANGUAGE
eNLS_DATE_FORMAT
é derivado deNLS_TERRITORY
. Eles são definidos quando você criou o banco de dados inicialmente, mas podem ser alterados alterando o arquivo de parâmetros de inicialização - somente se realmente necessário - ou no nível da sessão usando aALTER SESSION
sintaxe. Por exemplo:Isso significa:
DD
dia numérico do mês, 1 - 31MM
mês numérico do ano, 01 a 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 a que você está se referindo.HH24
hora do dia, 0 - 23MI
minuto da hora, 0 - 59SS
segundo, 0-59Você pode descobrir suas configurações atuais de idioma e idioma de data consultando
V$NLS_PARAMETERSs
e toda a gama de valores válidos consultandoV$NLS_VALID_VALUES
.Leitura adicional
Aliás, se você quiser o
count(*)
que precisa agrupar poremployee_id
Isso fornece a contagem por
employee_id
.fonte
DEC
nem sempre é necessariamente um mês válido. Geralmente é melhor para usar números em vez de nomestimestamp
literal em vez de umdate
literal:timestamp '2015-01-30 19:42:04'
(porque no ANSI SQL odate
tipo de dados não tem tempo, apenas otimestamp
tipo).DATE 2016-04-01
meios2016-04-01 00:00:00
. E acho que essa sintaxe funciona desde o Oracle 9i, pois é aqui que a sintaxe ANSI-SQL foi introduzida no Oracle.define
é um comando SQL * Plus que substitui o que você definiu em todas as variáveis de substituição com esse nome .ALTER SESSION
é uma instrução que permite que você modifique alguns parâmetros ou configurações do banco de dados durante a sessão #Conclusão,
to_char
trabalha à sua maneiraAssim,
Sempre use este formato AAAA-MM-DD para comparação em vez de MM-DD-AA ou DD-MM-AAAA ou qualquer outro formato
fonte
Você pode usar trunc e to_date da seguinte maneira:
fonte
da sua consulta:
acho que não é necessário exibir o número de funcionários contratados após 20 de junho de 1994. se você deseja mostrar o número de funcionários, pode usar:
Eu acho que é uma boa prática comparar datas que você pode usar:
fonte
Aspas simples devem estar lá, desde a data convertida em caractere.
fonte