2008-11-20 14 views
5

Czy istnieje sposób sprawdzania bieżącego DATEFOMRAT SQLServer 2005 jest obecnie używany z T-SQL?Ustawianie i zerowanie DATEFORMAT w SQLServer 2005

Mam aplikację odczytującą wstępnie wygenerowane instrukcje INSERT i wykonującą je względem bazy danych. Aby dane, które mają być wprowadzone do kultury, były niezależne, przechowuję wartości datetime-wartości reprezentowane w kulturze niezmienniczej (miesiąc/dzień/rok ...). Serwer bazy danych może być uruchamiany w różnych lokalizacjach, w zależności od ustawień regionalnych systemu (być może przy użyciu dnia/miesiąca/roku), więc insert może ulec awarii, ponieważ nie można przeanalizować datetime.

Wiem, że istnieją instrukcje "SET LANGUAGE" i "SET DATEFORMAT" w T-SQL, aby ustawić ustawienia narodowe, które mają być używane.
Nie chcę, aby te zmiany stały się trwałe (czy są trwałe?), Więc szukam sposobu na odczytanie DATEFORMAT z DB, zapisanie go, zmianę formatu według moich upodobań i zresetowanie go do zapisanej wartości po wstawieniu danych.

Jakieś pomysły, gdzie znaleźć tę wartość na serwerze?

Odpowiedz

5

Ustaw język i ustawienie DateFormat wpływa tylko na bieżącą sesję. Jeśli rozłączysz się z bazą danych i ponownie się połączysz, język i format daty zostaną przywrócone do wartości domyślnych.

Istnieje "sztuczka", której można użyć do określenia, czy DateFormat to m/d/r lub d/m/r.

Select DatePart(Month, '1/2/2000') 

Ta data jest ważna albo sposób. Jest 2 stycznia lub 1 lutego. Jeśli to zapytanie zwróci 1, oznacza to MDY. Jeśli zwraca 2, masz DMY.

+0

Dzięki! Wygląda na to, że trochę się martwię :) – lowglider

1

jeśli nie jest zbyt późno dat jako RRRRMMDD do SQL Server zawsze będą włożona prawidłowo niezależnie od ustawień dateformat DMY lub MDR

SET dateformat również nie jest stały i złożyć. Z mojego doświadczenia wynika to konkretne połączenie. Niektórzy mówią tylko o sesji, ale stwierdziłem, że jeśli połączenie zostanie zwrócone do puli i ponownie użyte, zanim zostanie utracone, zachowa ustawienie daty ustawione przez poprzedniego użytkownika.

4

Co z kolumną formatu date_ w sys.dm_ exec_sessions?

zawsze można przeglądać swoją własną sesję tak byłyby potrzebne żadne prawa na poziomie serwera

6

Poniższa instrukcja przeprowadzi operację data parsowania przy użyciu danego formatu daty (zmienna @dateFormat), a następnie ponownie włączyć oryginalną datę format.

declare @dateFormat nvarchar(3); 
set @dateFormat = 'dmy'; 

declare @originalDateFormat nvarchar(3); 
select @originalDateFormat = date_format from sys.dm_exec_sessions where session_id = @@spid; 

set dateformat @dateFormat; 

--Returns 1. 
select isdate('31/12/2010'); 

set dateformat @originalDateFormat; 

Należy zauważyć, że zmiany formatu daty dotyczą tylko bieżącego połączenia. Ponowne włączanie oryginalnego formatu daty jest wykonywane tylko w celu zapewnienia, że ​​ta zmiana nie wpłynie na późniejsze wyciągi wykonywane na tym samym połączeniu.

1

Znalazłem sposób, aby uzyskać to w tabeli opcji użytkownika w innym miejscu i przekonwertować go, aby uzyskać tylko dateformat. Może być przydatny dla innych (zauważ, że są różne inne ustawienia w tym samym stole, dzięki czemu możesz sprawdzić, czy ansi_nulls są ustawione i różne inne rzeczy w ten sam sposób):

create table #temp (SetOption nvarchar(50),Val nvarchar(50)) 

insert into #temp 
exec sp_executesql N'dbcc useroptions' 

select val from #temp where setoption='dateformat' 

drop table #temp 
Powiązane problemy