31-DEC-95
no es una cadena, ni lo es 20-JUN-94
. Son números con algunas cosas adicionales agregadas al final. Esto debería ser '31-DEC-95'
o '20-JUN-94'
- tenga en cuenta la comilla simple, '
. Esto te permitirá hacer una comparación de cadenas.
Sin embargo, no estás haciendo una comparación de cadenas; Estás haciendo una comparación de fechas . Debes transformar tu cadena en una fecha. Ya sea utilizando la TO_DATE()
función incorporada o un literal de fecha .
HASTA LA FECHA()
select employee_id
from employee
where employee_date_hired > to_date('31-DEC-95','DD-MON-YY')
Este método tiene algunas trampas innecesarias
- Como a_horse_with_no_name señaló en los comentarios,
DEC
no necesariamente significa diciembre. Depende de tu NLS_DATE_LANGUAGE
y la NLS_DATE_FORMAT
configuración. Para asegurarse de que su comparación con el trabajo en cualquier configuración regional que se puede utilizar el modelo de formato de fecha y hora MM
en vez
- El año '95 es inexacto. Sabes que te refieres a 1995, pero ¿y si fuera '50, es 1950 o 2050? Siempre es mejor ser explícito
select employee_id
from employee
where employee_date_hired > to_date('31-12-1995','DD-MM-YYYY')
Literales de fecha
Un literal de fecha es parte del estándar ANSI, lo que significa que no tiene que usar una función específica de Oracle. Cuando utilice un literal, debe especificar su fecha en el formato YYYY-MM-DD
y no puede incluir un elemento de hora.
select employee_id
from employee
where employee_date_hired > date '1995-12-31'
Recuerde que el tipo de datos de fecha de Oracle incluye un elemento de tiempo, por lo que la fecha sin una porción de tiempo es equivalente a 1995-12-31 00:00:00
.
Si desea incluir una porción de tiempo, entonces debería usar un literal de marca de tiempo, que toma el 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'
Más información
NLS_DATE_LANGUAGE
se deriva de NLS_LANGUAGE
y NLS_DATE_FORMAT
se deriva de NLS_TERRITORY
. Estos se configuran cuando creó inicialmente la base de datos, pero pueden modificarse cambiando el archivo de parámetros de inicialización, solo si es realmente necesario, o en el nivel de sesión utilizando la ALTER SESSION
sintaxis. Por ejemplo:
alter session set nls_date_format = 'DD.MM.YYYY HH24:MI:SS';
Esto significa:
DD
día numérico del mes, 1 - 31
MM
mes numérico del año, 01-12 (enero es 01)
YYYY
Año de 4 dígitos: en mi opinión, esto siempre es mejor que un año de 2 dígitos, YY
ya que no hay confusión con el siglo al que te refieres.
HH24
hora del día, 0-23
MI
minuto de la hora, 0 - 59
SS
segundo del minuto, 0-59
Puede averiguar su idioma actual y la configuración del idioma de la fecha consultando V$NLS_PARAMETERSs
y la gama completa de valores válidos consultando V$NLS_VALID_VALUES
.
Otras lecturas
Por cierto, si quieres, count(*)
debes agrupar poremployee_id
select employee_id, count(*)
from employee
where employee_date_hired > date '1995-12-31'
group by employee_id
Esto te da la cuenta por employee_id
.
> <
oBETWEEN '' AND ''