2017-01-09 18 views
5

Wprowadzam z instrukcją SQL do tabeli dwie daty, ale używam jej na różnych maszynach z różnymi SQL Server i ustawionym językiem. Czasami „04.01.2017 00:00:00” jest 01 kwietnia 2017 czasami jest to 04 stycznia 2017. Chcę kwietnia 01.Deklaracja na temat różnych SQL Server z różnymi językami

INSERT INTO [table] ([id], [value], [datefrom], [dateto]) 
    SELECT 
     NEWID(), 3.5, '2017-01-04 00:00:00', '2027-01-05 00:00:00' 
    FROM 
     [settings] 

mogę używać po prostu użyć SET LANGUAGE german; na początku skryptu a to ustawienie jest tylko tymczasowe dla wyciągu i nie zmienia na stałe języka? Czy to nie jest dobra droga? Zobacz użyte oświadczenie poniżej. Z góry dziękuję.

SET LANGUAGE german; 

INSERT INTO [table]([id], [value], [datefrom], [dateto]) 
    SELECT 
     NEWID(), 3.5, '2017-01-04 00:00:00', '2027-01-05 00:00:00' 
    FROM 
     [settings] 
+0

http://dba.stackexchange.com/a/39439/110455 – McNets

Odpowiedz

4

Jeśli potrzebujesz do obsługi wielu ustawień językowych, najlepiej używać (nieco dostosowany) Format ISO-8601 dla SQL Server daty-jako-literały literowe.

Jeśli trzeba użyć DATETIME (które powinny być stopniowo wycofywane w SQL Server 2008 - korzystać DATE jeśli trzeba tylko datę, DATETIME2(n) jeśli trzeba obie daty & czasu), należy użyć jednego z dwóch możliwych formatach:

YYYYMMDD HH:MM:SS  // **NO** dashes for the date portion! 

lub

YYYY-MM-DDTHH:MM:SS  // delimiter "T" between date and time parts 

Korzystnie, jeśli naprawdę potrzebujesz tylko DATE (brak czasu), użyj DATE typ danych, a następnie użyć tego formatu:

YYYYMMDD 

To jest gwarantowane do pracy zawsze i bez konieczności przełączania się wokół ustawienia daty i językowych po prostu, aby Twoje wypowiedzi INSERT pracować ....

Zatem 20170401 będzie zawsze być interpretowane jako " 1 kwietnia 2017 r. "

2

można używać języka neutralnego (ODBC) dosłowne, {d 'YYYYMMDD'} na bieżąco i {ts'YYYY-MM-DD hh:mm:ss[.nnn]'} dla datetime.

Więc

{ts '2017-04-01 00:00:00'} 

powinno działać.