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

Función TO_DATE() en Oracle

En Oracle Database, el TO_DATE() la función convierte su argumento a un valor de DATE tipo de datos.

Sintaxis

La sintaxis es así:

TO_DATE(char [ DEFAULT return_value ON CONVERSION ERROR ]
  [, fmt [, 'nlsparam' ] ])

El char el argumento puede ser cualquier expresión que se evalúe como una cadena de caracteres de CHAR , VARCHAR2 , NCHAR o NVARCHAR2 tipo de datos.

El fmt opcional especifica el formato de char . Si omite fmt , luego char debe estar en el formato de fecha predeterminado. El formato de fecha predeterminado está determinado por el NLS_DATE_FORMAT parámetro de inicialización, que a su vez está implícitamente establecido por NLS_TERRITORY parámetro, pero también se puede configurar explícitamente (consulte Cómo verificar el formato de fecha de su sesión de Oracle).

El 'nlsparam' opcional El argumento especifica el idioma en el que se proporcionan los nombres y las abreviaturas de los meses y los días. Toma la siguiente forma:

'NLS_DATE_LANGUAGE = language'

Ejemplo

Aquí hay un ejemplo básico para demostrarlo:

SELECT 
    TO_DATE(
        '25-Aug-2030', 
        'DD-Mon-RRRR'
    )
FROM DUAL;

Resultado:

25/AUG/30

El formato del resultado está determinado por el NLS_DATE_FORMAT de su sesión. parámetro. Podemos verificar el valor de NLS_DATE_FORMAT parámetro consultando el V$NLS_PARAMETERS ver:

SELECT VALUE
FROM V$NLS_PARAMETERS
WHERE PARAMETER = 'NLS_DATE_FORMAT';

Resultado:

DD/MON/RR

El valor predeterminado de NLS_TIMESTAMP_FORMAT el parámetro se deriva de NLS_TERRITORY parámetro. En mi caso el NLS_TERRITORY el parámetro es AUSTRALIA .

Esto es lo que sucede cuando cambio el NLS_TERRITORY parámetro a otro territorio, luego llame a TO_TIMESTAMP() de nuevo:

ALTER SESSION SET NLS_TERRITORY = 'AMERICA';
SELECT 
    TO_DATE(
        '25-Aug-2030', 
        'DD-Mon-RRRR'
    )
FROM DUAL;

Resultado:

25-AUG-30

Esta vez, el resultado se devuelve en un formato diferente.

Alternativamente, puede cambiar el valor de NLS_TIMESTAMP_FORMAT parámetro directamente. Esto cambiará ese parámetro sin afectar otros parámetros. Consulte Cómo cambiar el formato de fecha en su sesión de Oracle para obtener más información y ejemplos.

Formato predeterminado

En este ejemplo, omito el fmt argumento:

SELECT 
    TO_DATE(
        '25-AUG-30'
    )
FROM DUAL;

Resultado:

25-AUG-30

Al hacer esto, el argumento debe estar en el formato predeterminado de DATE tipo de datos, que está determinado por el NLS_DATE_FORMAT parámetro de inicialización.

Aquí hay un ejemplo de lo que sucede cuando pasamos un valor que no se ajusta a este formato:

SELECT 
    TO_DATE(
        '2030-08-25'
    )
FROM DUAL;

Resultado:

Error report -
ORA-01861: literal does not match format string

Para solucionar esto, tendría que cambiar mi entrada o cambiar el valor de NLS_DATE_FORMAT parámetro.

Por lo general, no es una buena práctica omitir el modelo de formato. En otras palabras, es una buena práctica proporcionar siempre un modelo de formato al usar esta función. Aquí hay una lista completa de elementos de formato de fecha y hora que se pueden usar al construir un modelo de formato.

Proporcionar un valor predeterminado en caso de error de conversión

También tiene la opción de proporcionar un valor para devolver en caso de que haya un error al convertir el argumento a DATE tipo.

Ejemplo:

SET NULL 'null';
SELECT 
    TO_DATE(
    'Oops!'
    DEFAULT null ON CONVERSION ERROR
    )
FROM DUAL;

Resultado:

null

En este caso especifiqué que null debe devolverse siempre que haya un error de conversión.

De forma predeterminada, SQLcl y SQL*Plus devuelven un espacio en blanco cada vez que null ocurre como resultado de un SQL SELECT declaración.

Sin embargo, puede usar SET NULL para especificar una cadena diferente a devolver. Aquí especifiqué que la cadena null debe ser devuelto.

El 'nlsparam' Argumento

El 'nlsparam' opcional El argumento especifica el idioma en el que se proporcionan los nombres y las abreviaturas de los meses y los días. Toma la siguiente forma:

'NLS_DATE_LANGUAGE = language'

Ejemplo

SELECT 
    TO_DATE(
        '25-August-2030', 
        'DD-Month-RRRR',
        'NLS_DATE_LANGUAGE = SPANISH'
    )
FROM DUAL;

Resultado:

25-AUG-30

Tenga en cuenta que el resultado aún se devuelve de acuerdo con el NLS_DATE_FORMAT de la sesión actual parámetro. Es solo que la entrada estaba en un idioma diferente.

Esto es lo que sucede cuando cambio August a August mientras usa el mismo 'nlsparam' valor:

SELECT 
    TO_DATE(
        '25-August-2030', 
        'DD-Month-RRRR',
        'NLS_DATE_LANGUAGE = SPANISH'
    )
FROM DUAL;

Resultado:

Error report -
ORA-01843: not a valid month

Esto sucedió porque no proporcioné la fecha en el idioma especificado por 'nlsparam' argumento (español).

Cambiándolo a English resuelve este problema:

SELECT 
    TO_DATE(
        '25-August-2030', 
        'DD-Month-RRRR',
        'NLS_DATE_LANGUAGE = English'
    )
FROM DUAL;

Resultado:

25-AUG-30

Consulte Cómo devolver una lista de idiomas admitidos en Oracle si le resulta útil.

Argumentos nulos

Pasando null da como resultado null :

SET NULL 'null';
SELECT 
    TO_DATE(null)
FROM DUAL;

Resultado:

null

Recuento de argumentos no válidos

Llamar a la función sin pasar ningún argumento da como resultado un error:

SELECT TO_DATE()
FROM DUAL;

Resultado:

SQL Error: ORA-00938: not enough arguments for function
00938. 00000 -  "not enough arguments for function"

Y pasar demasiados argumentos también da como resultado un error:

SELECT 
    TO_DATE(
        '25-Aug-2030', 
        'DD-Mon-RRRR',
        'NLS_DATE_LANGUAGE = English',
        'Gosh',
        'Dang'
    )
FROM DUAL;

Resultado:

SQL Error: ORA-00939: too many arguments for function
00939. 00000 -  "too many arguments for function"