sql - que - formato fecha oracle to_date
Comparación de fechas en Oracle SQL (5)
Conclusión,
to_char
funciona a su manera
Asi que,
Utilice siempre este formato AAAA-MM-DD para comparar en lugar de MM-DD-AA o DD-MM-AAAA o cualquier otro formato
Estoy tratando de que muestre el número de empleados contratados después del 20 de junio de 1994, pero recibo un error que dice "identificador inválido JUN." ¡Ayuda, gracias!
Select employee_id, count(*)
From Employee
Where to_char(employee_date_hired, ''DD-MON-YY'') > 31-DEC-95;
La comilla simple debe estar allí, desde la fecha convertida en carácter.
Select employee_id, count(*) From Employee Where to_char(employee_date_hired, ''DD-MON-YY'') > ''31-DEC-95'';
Puede usar trunc y to_date de la siguiente manera:
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;
de su consulta:
Select employee_id, count(*) From Employee
Where to_char(employee_date_hired, ''DD-MON-YY'') > ''31-DEC-95''
Creo que no es la cantidad de empleados contratados después del 20 de junio de 1994. Si desea mostrar el número de empleados, puede usar:
Select count(*) From Employee
Where to_char(employee_date_hired, ''YYYMMMDDD'') > 19940620
Creo que para obtener mejores prácticas, compare las fechas que puede usar:
employee_date_hired > TO_DATE(''20-06-1994'', ''DD-MM-YYYY'');
or
to_char(employee_date_hired, ''YYYMMMDDD'') > 19940620;
31-DEC-95
no es una cadena, ni es 20-JUN-94
. Son números con algunas cosas adicionales añadidas al final. Esto debería ser ''31-DEC-95''
o ''20-JUN-94''
- ''20-JUN-94''
la comilla simple, ''
. Esto le 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 fecha . Deberías transformar tu cadena en una fecha. Ya sea mediante el uso de la función integrada TO_DATE()
, 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 algunos inconvenientes innecesarios
- Como a_horse_with_no_name anotado en los comentarios,
DEC
, no significa necesariamente diciembre. Depende de la configuración deNLS_DATE_LANGUAGE
yNLS_DATE_FORMAT
. Para asegurarse de que su comparación con el trabajo en cualquier localidad, puede usar el formato de fecha y hora del modeloMM
- 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 especificar su 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, entonces deberá usar un literal de fecha y hora, 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 se pueden modificar cambiando el archivo de parámetros de inicialización, solo si realmente se requiere, o en el nivel de sesión utilizando la sintaxis ALTER SESSION
. 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) - Año de 4 dígitos de
YYYY
: en mi opinión, esto siempre es mejor que un añoYY
2 dígitos 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 al consultar V$NLS_PARAMETERSs
y la gama completa de valores válidos al consultar V$NLS_VALID_VALUES
.
Otras lecturas
Por cierto, si quieres count(*)
necesitas 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
.