SQL Server Función ISDATE () – ¿alguien Puede explicar esto?

Así que yo estaba buscando en la documentación de la función ISDATE() en SQL Server y lo vimos en los ejemplos:

SET DATEFORMAT mdy;
SELECT ISDATE('15/04/2008'); --Returns 0.
SET DATEFORMAT mdy;
SELECT ISDATE('15/2008/04'); --Returns 0.
SET DATEFORMAT mdy;
SELECT ISDATE('2008/15/04'); --Returns 0.
SET DATEFORMAT mdy;
SELECT ISDATE('2008/04/15'); --Returns 1.

El último ejemplo devuelve 1 (una fecha válida), pero el formato de fecha anterior no coincide con el formato en la expresión de la función. Pensé que era un error en la documentación, pero, a continuación, curiosamente lo probé yo mismo y lo hace realmente retorno 1.

Así que ¿por qué es «2008/04/15′ una fecha válida cuando el formato de la fecha es mdy?

Documentación aquí: http://msdn.microsoft.com/en-us/library/ms187347(SQL.105).aspx

  • juergen d: ¿qué idioma por defecto?
  • Probablemente tratando de demostrar un formato que siempre funciona, no importa qué idioma/dateformat valores están en vigor. Por supuesto, en este sentido, es malo (prueba set language british; antes de la consulta)
InformationsquelleAutor Jamie | 2012-04-26

2 Kommentare

  1. 5

    de http://msdn.microsoft.com/en-us/library/ms187347%28SQL.105%29.aspx#SessionSettingDependencies

    El valor de retorno de ISDATE depende de la configuración establecida por el CONJUNTO de
    DATEFORMAT, ajusta el IDIOMA y el idioma por defecto de la opción.

    Así que si la cadena no se aplica para el set dateformat también cecks el idioma predeterminado de la opción que permite a las fechas en un formato como y/m/d

    • Valdría la pena señalar que SET LANGUAGE también establece la configuración de SET DATEFORMAT (fuente)
  2. 4

    Si nos set DateFormat a mdy, a continuación, se validará verdadero para todas las fechas en este formato.

    Si se encuentra con formato de fecha no válida, como por mdy, a continuación, busque la configuración según el Idioma. Si se encuentra de fecha válido como por soportados por el lenguaje, a continuación, devuelve true else falso.

    si Un usuario tiene un idioma predeterminado de us_english, luego de una fecha de 4/6/2006 será interpretado como el 6 de abril de 2006. Si el usuario B tiene un idioma predeterminado de la ‘British’, a continuación, la fecha será interpretado como 4 de junio de 2006.

    /* Use these sessions settings. */
    SET LANGUAGE us_english;
    SET DATEFORMAT mdy;
    /* Expression in mdy dateformat */
    SELECT ISDATE('04/15/2008'); --Returns 1.
    /* Expression in mdy dateformat */
    SELECT ISDATE('04-15-2008'); --Returns 1. 
    /* Expression in mdy dateformat */
    SELECT ISDATE('04.15.2008'); --Returns 1. 
    /* Expression in myd  dateformat */
    SELECT ISDATE('04/2008/15'); --Returns 1.
    
    SET DATEFORMAT mdy;
    SELECT ISDATE('15/04/2008'); --Returns 0.
    SET DATEFORMAT mdy;
    SELECT ISDATE('15/2008/04'); --Returns 0.
    SET DATEFORMAT mdy;
    SELECT ISDATE('2008/15/04'); --Returns 0.
    SET DATEFORMAT mdy;
    SELECT ISDATE('2008/04/15'); --Returns 1.
    
    SET DATEFORMAT dmy;
    SELECT ISDATE('15/04/2008'); --Returns 1.
    SET DATEFORMAT dym;
    SELECT ISDATE('15/2008/04'); --Returns 1.
    SET DATEFORMAT ydm;
    SELECT ISDATE('2008/15/04'); --Returns 1.
    SET DATEFORMAT ymd;
    SELECT ISDATE('2008/04/15'); --Returns 1.
    
    SET LANGUAGE English;
    SELECT ISDATE('15/04/2008'); --Returns 0.
    SET LANGUAGE Hungarian;
    SELECT ISDATE('15/2008/04'); --Returns 0.
    SET LANGUAGE Swedish;
    SELECT ISDATE('2008/15/04'); --Returns 0.
    SET LANGUAGE Italian;
    SELECT ISDATE('2008/04/15'); --Returns 1.
    
    /* Return to these sessions settings. */
    SET LANGUAGE us_english;
    SET DATEFORMAT mdy;

    El formato Numérico puede utilizar un guión (-), punto (.) o barra diagonal (/) como separador. Las reglas para la forma en que SQL Server analiza la cadena no cambia dependiendo del separador. Un error común es que el ANSI SQL formato (a veces un poco incorrectamente referido como el «formato ISO»), 1998-02-23, es el lenguaje neutral para smalldatetime y datetime. No, no. Es un formato numérico y por lo tanto es dependiente en el SET DATEFORMAT y ESTABLECER la configuración de IDIOMA:

    SET LANGUAGE us_english 
    SELECT CAST('2003-02-28' AS datetime) 
    -----------------------
    2003-02-28 00:00:00.000
    
    SET LANGUAGE british 
    SELECT CAST('2003-02-28' AS datetime) 
    Server: Msg 242, Level 16, State 3, Line 4
    The conversion of a char data type to a datetime data type resulted in an out-of-range datetime value.

    Por favor, lea el mensaje de error de cerca. Se dice cuál es exactamente el problema. Especifique el valor de datetime como una cadena, y debido a que la cadena no se formó de acuerdo con el formato que se utiliza, y el valor de DATEFORMAT, SQL Server no puede convertir la cadena en un valor de datetime.

    • Valdría la pena agregar que YYYYMMDD es un seguro de formato de fecha, y YYYY-MM-DDThh:mm:ss es un seguro de formato datetime (donde T es, literalmente, la carta T, en lugar de un espacio entre la fecha y la hora)

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea