2013-07-09 15 views
5

Abbiamo migrato il nostro database di recente su un server diverso e, in questo modo, penso che l'interrogazione del formato della data sia cambiata in qualche modo.Formattazione della data di SQL Server dalla stringa

precedenza abbiamo potuto utilizzare il seguente ..

SELECT * FROM table WHERE date > 'YYYY-MM-DD' 

Comunque adesso dobbiamo usare ..

SELECT * FROM table WHERE date > 'YYYY-DD-MM' 

Qualcuno può dirmi di cosa ho bisogno di cambiare per tornare alla versione precedente ?

+0

La risposta è lì http://stackoverflow.com/questions/17491459/how-can-i- get-sql-server-to-use-user-locale-per-data-formato-per-una-query –

risposta

2

provare questo -

Query:

SET DATEFORMAT ymd 

Leggi impostazioni correnti:

DBCC USEROPTIONS 

uscita:

Set Option     Value 
-------------------------- ----------------- 
... 
language     us_english 
dateformat     ymd 
... 
+0

come faccio a sapere qual è il dataformat attuale? – lisburnite

+2

Prova a usare 'DBCC USEROPTIONS' – Devart

+0

ok, è attualmente impostato su dmy, sicuramente ciò significa che dovrei interrogare usando 'DD-MM-YYYY' – lisburnite

0

E 'una questione di lingua/cultura

Set Language 'us_english' 
+0

come faccio a leggere qual è la lingua corrente? – lisburnite

+0

@lisburnite per questa situazione prova anche a usare 'DBCC USEROPTIONS' – Devart

+2

select @@ language – Serge

2

Hai ragione, il formato della data è diversa tra i server.

Un sacco di persone cadono nella trappola di presumere che se si specifica un valore letterale come 'YYYY-MM-DD', verrà interpretato come tale indipendentemente dal formato di data corrente. Questo non è corretto SQL Server vede le 4 cifre all'inizio della stringa e deduce correttamente che esse rappresentano l'anno. Tuttavia, utilizza quindi il formato della data corrente per indicare in quale direzione del mese e del giorno. Se ti trovi nel Regno Unito, ad esempio, questo ti mette in una situazione imbarazzante perché hai bisogno di un formato data di per interpretare un valore letterale come 'DD-MM-YYYY', ma un formato data di MDY per interpretare un valore letterale come 'YYYY-MM-DD'.

sono disponibili diverse opzioni:

  • SET DATEFORMAT YMD, e non lasciare che gli utenti date entrare in qualsiasi altro modo.
  • Utilizzare la sintassi letterale data ODBC {d'YYYY-MM-DD'}. Questo verrà analizzato correttamente indipendentemente dal formato della data corrente. CONVERT(DATE, 'YYYY-MM-DD', 120) ha lo stesso effetto.
  • Rimuovere tutti i valori letterali dalle query e utilizzare i parametri. Questa è di gran lunga l'alternativa migliore, e la consiglio vivamente.
+0

Grazie, ha senso per l'anno che viene analizzato per primo, seguito dall'ordine del mese e della data – lisburnite

+0

usa i formati data ISO –

2

si utilizzano formati diversi per la stringa, quindi è possibile evitare questo comportamento.

Ci sono 2 formati ISO sempre specifici: il server SQL li analizzerà sempre nello stesso modo indipendentemente dall'impostazione del formato della data del server.

Questi sono:

1) forma breve: AAAAMMGG.Esempio '20120301' - 1 marzo 2012

2) Forma lunga: AAAA-MM-GGTHH: MM: SS.msms '. Esempio '2012-03-01T12: 13: 00.000Z' - 1 marzo 2012 alle 13 (12)

Nel formato lungo i millisecondi sono facoltativi - questo è un ISO datetime perfettamente accettabile '2012- 03-01T12: 13: 00Z '

La Z alla fine è informazioni sul fuso orario. SQL Server in realtà non richiede questo. (Anche se altri prodotti sono un po 'più impegnativo)

Prova questo per esempio:

DECLARE @foo DATETIME 

SET DATEFORMAT DMY 

-- this will be the 3rd of january in DMY 
SET @foo = '2012-03-01' 
SELECT 'DMY: Not ISO', @foo 

SET @foo = '20120301' 
SELECT 'DMY: ISO', @foo 

SET DATEFORMAT MDY 

-- this will be the 1st of March in MDY 
SET @foo = '2012-03-01' 
SELECT 'MDY: not ISO', @foo 

SET @foo = '20120301' 
SELECT 'MDY: ISO', @foo 

Quando si utilizza il testo inserire date si dovrebbe sempre tenta di utilizzare una delle due norme ISO. Semplicemente rende le cose molto più deterministiche.

formato breve (SQL Server) http://msdn.microsoft.com/en-US/library/ms187085(v=sql.90).aspx

ISO 8601 Format (SQL Server) http://msdn.microsoft.com/en-us/library/ms190977(v=sql.90).aspx

+0

+1 - per la buona risposta. – Devart