sql >> Base de Datos >  >> RDS >> Oracle

Comparación de fechas en Oracle SQL

31-DEC-95 no es una cadena, ni 20-JUN-94 . Son números con algunas cosas adicionales agregadas al final. Debería ser '31-DEC-95' o '20-JUN-94' - tenga en cuenta la comilla simple, ' . Esto le permitirá hacer una comparación de cadenas.

Sin embargo, no está haciendo una comparación de cadenas; estás haciendo una comparación de fechas . Debes transformar tu cadena en una fecha. Ya sea usando el TO_DATE() incorporado función, o un literal de fecha.

HASTA_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 se señaló en los comentarios a_horse_with_no_name, DEC , no significa necesariamente diciembre. Depende de tu NLS_DATE_LANGUAGE y NLS_DATE_FORMAT ajustes. Para asegurarse de que su comparación funcione en cualquier configuración regional, puede usar el modelo de formato de fecha y hora MM en cambio
  • 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. Al usar un literal, debe especifica tu fecha en el formato YYYY-MM-DD y no puede incluir un elemento de tiempo.

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, debe 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 establecen cuando creó inicialmente la base de datos, pero se pueden modificar cambiando el archivo de parámetros de inicialización, solo si es realmente necesario, o a nivel de sesión utilizando 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 es siempre 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 .

Lecturas adicionales

  • Modelos de formato

Por cierto, si desea el count(*) necesita agrupar por employee_id

select employee_id, count(*)
  from employee
 where employee_date_hired > date '1995-12-31'
 group by employee_id

Esto le da el recuento por employee_id .