Estoy tratando de que muestre el número de empleados que son contratados después del 20 de junio de 1994, pero recibo un error que dice "Identificador inválido JUN". ¡Por favor ayuda, gracias!
Select employee_id, count(*)
From Employee
Where to_char(employee_date_hired, 'DD-MON-YY') > 31-DEC-95;
> <
oBETWEEN '' AND ''
Respuestas:
31-DEC-95
no es una cadena, ni lo es20-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()
Este método tiene algunas trampas innecesarias
DEC
no necesariamente significa diciembre. Depende de tuNLS_DATE_LANGUAGE
y laNLS_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 horaMM
en vezLiterales 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.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]
Más información
NLS_DATE_LANGUAGE
se deriva deNLS_LANGUAGE
yNLS_DATE_FORMAT
se deriva deNLS_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 laALTER SESSION
sintaxis. Por ejemplo:Esto significa:
DD
día numérico del mes, 1 - 31MM
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-23MI
minuto de la hora, 0 - 59SS
segundo del minuto, 0-59Puede 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 consultandoV$NLS_VALID_VALUES
.Otras lecturas
Por cierto, si quieres,
count(*)
debes agrupar poremployee_id
Esto te da la cuenta por
employee_id
.fuente
DEC
No es necesariamente siempre un mes válido. Por lo general, es mejor usar números en lugar de nombrestimestamp
literal en lugar de undate
literal:timestamp '2015-01-30 19:42:04'
(porque en ANSI SQL a Eldate
tipo de datos no tiene un momento, sólo eltimestamp
tipo de datos lo hace).DATE 2016-04-01
medios2016-04-01 00:00:00
realmente. Y creo que esta sintaxis funciona desde Oracle 9i, ya que aquí es donde se introdujo la sintaxis ANSI-SQL en Oracle.define
es un comando SQL * Plus que sustituye lo que haya definido en todas las variables de sustitución con ese nombre .ALTER SESSION
es una declaración que le permite modificar algunos parámetros o configuraciones de la base de datos durante la sesiónConclusión,
to_char
trabaja a su maneraEntonces,
Utilice siempre este formato AAAA-MM-DD para comparar en lugar de MM-DD-AA o DD-MM-AAAA o cualquier otro formato
fuente
Puede usar trunc y to_date de la siguiente manera:
fuente
de su consulta:
creo que no es para mostrar la cantidad de empleados que son contratados después del 20 de junio de 1994. si desea mostrar la cantidad de empleados, puede usar:
Creo que las mejores prácticas para comparar fechas pueden usar:
fuente
La comilla simple debe estar allí, ya que la fecha se convirtió en carácter.
fuente