Estoy tratando de conseguir para mostrar el número de empleados que son contratados después del 20 de junio de 1994,
Pero me sale un error que dice «JUN’ identificador no válido. Por favor ayuda, gracias!

Select employee_id, count(*)
From Employee
Where to_char(employee_date_hired, 'DD-MON-YY') > 31-DEC-95; 
  • Tenga en cuenta también que puede utilizar cualquiera de > < o BETWEEN '' AND ''
InformationsquelleAutor user1336830 | 2012-04-16

5 Comentarios

  1. 271

    31-DEC-95 no es una cadena, ni es 20-JUN-94. Son números con algunas cosas extras añadidos en la final. Este debe ser '31-DEC-95' o '20-JUN-94' – nota de la comilla simple, '. Esto le permitirá hacer una comparación de cadenas.

    Sin embargo, usted no está haciendo una comparación de cadenas; usted está haciendo una fecha de comparación. Usted debe transformar su cadena en una fecha. Ya sea mediante el uso de la incorporada en el TO_DATE() función, o un literal de fecha.

    TO_DATE()

    select employee_id
      from employee
     where employee_date_hired > to_date('31-DEC-95','DD-MON-YY')

    Este método tiene un par de errores innecesarios

    • Como a_horse_with_no_name se indicó en los comentarios, DEC, no significa necesariamente que el mes de diciembre. Depende de tu NLS_DATE_LANGUAGE y NLS_DATE_FORMAT configuración. Para asegurarse de que su comparación con el trabajo en cualquier lugar usted puede utilizar el formato datetime modelo MM lugar
    • El año ’95 es inexacta. Usted sabe que significa 1995, pero lo que si fue ’50, es que de 1950 o el añ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')

    Los literales de fecha

    Una fecha literal es parte del estándar ANSI, lo que significa que usted no tiene que usar un Oráculo función específica. Cuando se utiliza un literal que debe indicar la fecha en el formato YYYY-MM-DD y usted no puede incluir un elemento de tiempo.

    select employee_id
      from employee
     where employee_date_hired > date '1995-12-31'

    Recordar que el Oráculo tipo de datos de fecha incluye un tiempo elemement, 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 usted tendría que usar una marca de tiempo literal, que toma el formato de 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 establece cuando se creó inicialmente la base de datos, sino que puede ser alterado por el cambio de su inialization archivo de parámetros – sólo si es realmente necesario – o en el nivel de sesión mediante el uso de la ALTER SESSION sintaxis. Por ejemplo:

    alter session set nls_date_format = 'DD.MM.YYYY HH24:MI:SS';

    Esto significa:

    • DD numéricos día del mes, 1 – 31
    • MM numérico mes 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 como no hay confusión con lo que en el siglo que se está refiriendo.
    • HH24 horas del día, 0 – 23
    • MI minutos de la hora, 0 – 59
    • SS segundo de los minutos, 0-59

    Usted pueda encontrar su idioma actual y la fecha de la configuración de idioma mediante la consulta de V$NLS_PARAMETERSs y la gama completa de valores válidos consultando V$NLS_VALID_VALUES.

    Leer más


    Por cierto, si desea que 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 a usted el recuento de por employee_id.

    • +1 para el uso de una máscara de formato en to_date(). Tenga en cuenta que este puede fallar en diferentes entornos debido a las diferentes configuraciones de idioma. DEC no es necesariamente válido de un mes. Por lo general es mejor usar números en lugar de nombres de
    • gracias por el punto. He actualizado con tu sugerencia.
    • Que puede especificar un tiempo con una ANSI literal – sólo necesitas especificar un timestamp literal en lugar de un date literal: timestamp '2015-01-30 19:42:04' (porque en ANSI SQL una de las date tipo de datos no tiene un tiempo, sólo el timestamp tipo de datos no).
    • El ANSI los literales de fecha es realmente una manera concisa la comparación de tener que escribir TO_DATE, Fecha y Formato de cada momento. Bueno para LAZY desarrolladores como yo. Una cosa a Notar es el DATE 2016-04-01 significa 2016-04-01 00:00:00 realmente. Y creo que esta sintaxis funciona desde Oracle 9i como este es donde ANSI-SQL sintaxis se introdujo en Oracle.
    • Mi pensamiento ha evolucionado significativamente en los últimos 4 años @Leon : -) yo he actualizado la respuesta. Yo había mencionado que un literal de fecha no incluir un elemento de tiempo, pero he llamado a esta más explícitamente como has indicado. 9i soporte extendido terminó hace casi 6 años… y fue publicado hace 14 años. No debería ser relevante para la gran mayoría de los usuarios.
    • Es alter session equivalente a define de alguna manera?
    • No, es muy diferente @Alireza. define es un SQL*Plus comando que sustituye a lo que hemos definido en todas las variables de sustitución con ese nombre. ALTER SESSION es una instrucción que permite modificar algunos parámetros de base de datos o la configuración de la duración de la sesión
    • Puedes intentar hacer el mismo ejemplo, pero en comparación con sysdate ? 🙂
    • Porque estás comparando comparable tipos de datos (en este caso la fecha -> la fecha, la marca de tiempo> marca de tiempo o fecha -> marca de tiempo), es muy simple, @servicio. SYSDATE es una fecha para reemplazar la fecha o de fecha y hora con SYSDATE.

  2. 5

    Conclusión,

    to_char trabaja en su propio camino

    Así,

    Siempre utilice este formato AAAA-MM-DD para la comparación
    en lugar de MM-DD-YY o DD-MM-AAAA o cualquier otro formato de

  3. 4

    Puede utilizar 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;
  4. 2

    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 para mostrar el número de empleados que son contratados después del 20 de junio de 1994. si desea mostrar el número de empleados, se puede utilizar:

    Select count(*) From Employee 
    Where to_char(employee_date_hired, 'YYYMMMDDD') > 19940620 

    Creo que para la mejor práctica para comparar las fechas que usted puede utilizar:

    employee_date_hired > TO_DATE('20-06-1994', 'DD-MM-YYYY');
    or
    to_char(employee_date_hired, 'YYYMMMDDD') > 19940620;
  5. -4

    Sola cita debe estar allí, desde la fecha de convertir a caracteres.

    Seleccione id_empleado, count(*) 
    De Empleado 
    Donde to_char(employee_date_hired, 'DD-MON-YY') > '31-DIC-95'; 
    
    • Este SQL utiliza implícito un formato de fecha, no siempre funciona.
    • Se está trabajando muy bien.
    • Sólo trabajando muy bien para su específica NLS_* la configuración, puede que no funcione en otros clientes o servidores. El aceptó respuesta explica por qué una explícita formato de fecha es importante.
    • Este método es la comparación de cadenas de caracteres, no las fechas. La segunda cadena se inicia con un «3», por lo que el comparar obras como «orden alfabético». Curiosamente, este tipo de comparar realmente funciona ( más o menos por accidente ) si utiliza un formato AAAA-MM-DD. Pero claro, es mejor comparar las fechas de las fechas…

Dejar respuesta

Please enter your comment!
Please enter your name here