2008-11-20 122 views
5

有沒有一種方法可以查詢當前使用T-SQL的SQL Server 2005當前的DATEFOMRAT?在SQLServer 2005中設置和重置DATEFORMAT

我有一個應用程序讀取預先生成的INSERT語句並對數據庫執行它們。爲了使數據獨立於文化之外,我存儲了不變文化(月/日/年......)中表示的日期時間值。數據庫服務器可能在不同的語言環境下運行,具體取決於系統區域設置(可能使用日/月/年),因此插入可能會崩潰,因爲無法分析日期時間。

我知道在T-SQL中有「SET LANGUAGE」和「SET DATEFORMAT」語句來設置要使用的語言環境。
我不想讓這些更改成爲永久的(它們是永久的嗎?),所以我正在尋找一種方法來從數據庫中讀取DATEFORMAT,存儲它,根據我的喜好更改格式並將其重置爲存儲的值數據插入後。

任何想法在哪裏可以找到服務器中的價值?

回答

5

設置語言和設置DateFormat隻影響當前會話。如果斷開與數據庫的連接並重新連接,則語言和Dateformat將恢復爲默認值。

您可以使用'技巧'來確定DateFormat是m/d/y還是d/m/y。

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

這個日期是有效的。它是1月2日或2月1日。如果這個查詢返回1,那麼你有MDY。如果它返回2,你有DMY。

+0

謝謝!看起來我太擔心了:) – lowglider 2008-11-21 09:45:35

1

如果它不太晚提交您的日期爲年月日到SQL Server,他們將永遠是正確插入不管DMY或MDY日期格式設置

SET DATEFORMAT也沒有永久的。根據我的經驗,它會影響到特定的連接。有些人只說會話,但我發現如果連接返回到池並在丟失之前重用,則它保留由前一個用戶設置的dateformat設置。

4

sys.dm_ exec_sessions中的date_格式列怎麼樣?

您可以隨時查看自己的會話,這樣沒有服務器級別的權限,將需要

6

下面的語句將使用給定的日期格式(在@dateFormat變量)執行日期解析操作,然後重新啓用原來的日期格式。

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; 

請注意,日期格式更改僅適用於當前連接。重新啓用原始日期格式僅用於確保在同一連接上執行的後續語句不受此更改的影響。

1

我找到了一種方法在其他地方的用戶選項表中找到它,並將其轉換爲僅獲取dateformat。它可能對別人有用(注意它們是同一個表中的各種其他設置,因此您可以檢查是否設置了ansi_nulls以及其他各種相同的方法):

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