Esto puede depender de una variedad de factores: la configuración regional del sistema operativo, el idioma del usuario actual y la configuración del formato de la fecha. De forma predeterminada, Windows usa US English
, y la configuración del usuario es US English
y MDY
.
Pero aquí hay algunos ejemplos para mostrar cómo esto puede cambiar.
usuario está utilizando la configuración de idioma: BRITISH
-- works:
SET LANGUAGE BRITISH;
SELECT CONVERT(DATETIME, '30-04-2012 19:01:45');
-- fails:
SELECT CONVERT(DATETIME, '04/13/2012');
GO
(error)
Msg 242, Level 16, State 3, Line 5
The conversion of a varchar data type to a datetime data type resulted in an out-of-range value.
usuario está utilizando Français:
-- works:
SET LANGUAGE FRENCH;
SELECT CONVERT(DATETIME, '30-04-2012 19:01:45');
-- fails:
SELECT CONVERT(DATETIME, '04/13/2012');
GO
(error)
Msg 242, Level 16, State 3, Line 1
La conversion d'un type de données varchar en type de données datetime a créé une valeur hors limites.
usuario está de nuevo utilizando Français:
SET LANGUAGE FRENCH;
-- fails (proving that, contrary to popular belief, YYYY-MM-DD is not always safe):
SELECT CONVERT(DATETIME, '2012-04-30');
GO
(Error)
Msg 242, Level 16, State 3, Line 1
La conversion d'un type de données varchar en type de données datetime a créé une valeur hors limites.
usuario está utilizando DMY en lugar de MDY:
SET LANGUAGE ENGLISH;
SET DATEFORMAT DMY;
-- works:
SELECT CONVERT(DATETIME, '30-04-2012 19:01:45');
-- fails:
SELECT CONVERT(DATETIME, '04-30-2012');
GO
(Error)
Msg 242, Level 16, State 3, Line 2
The conversion of a varchar data type to a datetime data type resulted in an out-of-range value.
Su mejor opción, siempre, es utilizar formatos de fecha estándar ISO, no regionales, seguros y sin ambigüedades. Los dos Generalmente, recomiendo son:
YYYYMMDD - for date only.
YYYY-MM-DDTHH:MM:SS[.mmm] - for date + time, and yes that T is important.
Ninguno de estos fallan:
SET DATEFORMAT MDY;
SET LANGUAGE ENGLISH;
SELECT CONVERT(DATETIME, '20120430');
SELECT CONVERT(DATETIME, '2012-04-30T19:01:45');
SET LANGUAGE FRENCH;
SELECT CONVERT(DATETIME, '20120430');
SELECT CONVERT(DATETIME, '2012-04-30T19:01:45');
SET LANGUAGE BRITISH;
SELECT CONVERT(DATETIME, '20120430');
SELECT CONVERT(DATETIME, '2012-04-30T19:01:45');
SET DATEFORMAT DMY;
SELECT CONVERT(DATETIME, '20120430');
SELECT CONVERT(DATETIME, '2012-04-30T19:01:45');
Por lo tanto, le recomiendo que en vez de dejar que los usuarios escriben en los formatos de fecha de texto libre (o que utilice formatos poco fiables yourself), controle sus cadenas de entrada y asegúrese de que se adhieran a uno de estos formatos seguros. Entonces no importará qué configuraciones tenga el usuario o cuáles sean las configuraciones regionales subyacentes, sus fechas siempre serán interpretadas como las fechas en que estaban destinadas a ser.Si actualmente permite que los usuarios ingresen fechas en un campo de texto en un formulario, deje de hacerlo e implemente un control de calendario o, al menos, una lista de selección para poder controlar finalmente el formato de cadena que se transfiere a SQL Server.
Para algunos antecedentes, lea de "The ultimate guide to the datetime datatypes" Tibor Karaszi y mi post "Bad Habits to Kick : Mis-handling date/range queries."
Vea mi respuesta [aquí] (http://stackoverflow.com/a/23369706/2108149) cómo hacerlo dentro de una función definida por el usuario. –
@Eli Creo que te estás perdiendo el punto que estaba tratando de hacer. Si una persona está en Inglaterra y pasa una cadena '09/04/2014 'y otra persona está en los EE. UU. Y aprueba '09/04/2014', ¿cómo sabe mágicamente su función cuál de ellas significaba el 9 de abril y cuál? significaba el 4 de septiembre? –
Debo admitir que no leí todo el hilo, estaba buscando una solución de traducción de un mes y mientras la buscaba me encontré con su respuesta, por lo que pensé que algunas personas podrían encontrarla útil ... –