Questo può dipendere da una varietà di fattori: le impostazioni regionali del sistema operativo, la lingua dell'utente corrente e le impostazioni del dataformat. Per impostazione predefinita, Windows utilizza US English
e le impostazioni dell'utente sono US English
e MDY
.
Ma qui ci sono alcuni esempi per mostrare come questo può cambiare.
utente sta utilizzando le impostazioni della lingua 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.
utente sta utilizzando 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.
utente è di nuovo usando 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.
utente sta utilizzando DMY invece di 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.
La tua migliore scommessa, sempre, è quella di utilizzare formati di data ISO standard, non regionali, sicuri e non ambigui. I due Io di solito raccomando sono:
YYYYMMDD - for date only.
YYYY-MM-DDTHH:MM:SS[.mmm] - for date + time, and yes that T is important.
Nessuno di questi venga meno
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');
Perciò, vi raccomando vivamente che, invece di lasciare che gli utenti digitano nei liberi formati di data testo (o di utilizzare i formati inaffidabili te), controlla le stringhe di input e assicurati che aderiscano a uno di questi formati sicuri. Quindi non importa quali siano le impostazioni dell'utente o quali siano le impostazioni regionali sottostanti, le tue date saranno sempre interpretate come le date che avrebbero dovuto essere.Se attualmente si lascia che gli utenti inseriscano le date in un campo di testo in un modulo, smettere di farlo e implementare un controllo del calendario o almeno un elenco di selezione in modo da poter controllare in ultima analisi il formato stringa che viene passato a SQL Server.
Per alcuni sfondo, si prega di leggere di "The ultimate guide to the datetime datatypes" Tibor Karaszi e il mio post "Bad Habits to Kick : Mis-handling date/range queries."
Vedere la mia risposta [qui] (http://stackoverflow.com/a/23369706/2108149) come farlo all'interno di una funzione definita dall'utente. –
@Eli Penso che manchi il punto che stavo cercando di fare. Se una persona è in Inghilterra e passa una stringa '09/04/2014 'e un'altra persona è negli Stati Uniti e passa '09/04/2014', come fa la tua funzione magicamente a sapere quale di loro intendeva il 9 aprile e quale significava il 4 settembre? –
Devo ammettere che non ho letto tutto il thread, stavo cercando una soluzione di traduzione di un mese e mentre cercavo mi sono imbattuto nella tua risposta, quindi ho pensato che alcune persone potrebbero trovare utile ... –