2008-11-20 29 views
5

Có cách nào để truy vấn SQLFerverRAT DATEFOMRAT hiện tại 2005 hiện đang sử dụng với T-SQL không?Cài đặt và đặt lại DATEFORMAT trong SQLServer 2005

Tôi có một ứng dụng đọc các câu lệnh INSERT được tạo trước và thực thi chúng dựa vào cơ sở dữ liệu. Để làm cho dữ liệu được chèn vào văn hóa độc lập, tôi lưu trữ các giá trị datetime được biểu diễn trong văn hóa bất biến (tháng/ngày/năm ...). Máy chủ cơ sở dữ liệu có thể chạy theo miền địa phương khác, tùy thuộc vào ngôn ngữ hệ thống (có thể sử dụng ngày/tháng/năm), do đó chèn có thể bị lỗi vì không thể phân tích cú pháp thời gian datetime.

Tôi biết có các câu lệnh "SET LANGUAGE" và "SET DATEFORMAT" trong T-SQL để đặt ngôn ngữ được sử dụng.
Tôi không muốn thực hiện những thay đổi này vĩnh viễn (chúng có vĩnh viễn không?), Vì vậy tôi đang tìm cách đọc DATEFORMAT từ DB, lưu trữ, thay đổi định dạng theo ý thích của tôi và đặt lại thành giá trị được lưu trữ sau khi dữ liệu được chèn vào.

Bất kỳ ý tưởng nào để tìm giá trị đó trong máy chủ?

Trả lời

5

Đặt ngôn ngữ và đặt ngàyFormat chỉ ảnh hưởng đến phiên hiện tại. Nếu bạn ngắt kết nối khỏi cơ sở dữ liệu và kết nối lại, ngôn ngữ và Dateformat được đặt trở về giá trị mặc định của chúng.

Có một 'thủ thuật' bạn có thể sử dụng để xác định xem DateFormat là m/d/y hay d/m/y.

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

Ngày này hợp lệ theo cách này. Đó là ngày 2 tháng 1 hoặc ngày 1 tháng 2. Nếu truy vấn này trả về 1, thì bạn có MDY. Nếu nó trả về 2, bạn có DMY.

+0

Cảm ơn! Có vẻ như tôi lo lắng quá nhiều :) – lowglider

1

Nếu nó không quá muộn ngày bạn nộp như YYYYMMDD đến SQL Server và họ sẽ luôn được chèn một cách chính xác bất kể các thiết lập DateFormat DMY hoặc MDY

SET DateFormat cũng không phải là vĩnh viễn. Theo kinh nghiệm của tôi, nó ảnh hưởng đến kết nối cụ thể đó. Một số người nói phiên chỉ nhưng tôi thấy nếu kết nối được trả lại cho hồ bơi và tái sử dụng trước khi nó bị mất thì nó vẫn giữ lại thiết lập dateformat được thiết lập bởi một người dùng trước đó.

4

Còn cột định dạng date_ trong sys.dm_ exec_sessions thì sao?

Bạn luôn có thể xem phiên riêng của bạn để không có quyền cấp độ máy chủ sẽ là cần thiết

6

Tuyên bố sau đây sẽ thực hiện một hoạt động ngày phân tích cú pháp sử dụng một định dạng ngày cụ thể (biến @dateFormat) và sau đó lại cho phép ngày đầu tiên định dạng.

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; 

Lưu ý rằng thay đổi định dạng ngày chỉ áp dụng cho kết nối hiện tại. Việc bật lại định dạng ngày ban đầu chỉ được thực hiện để đảm bảo rằng các câu lệnh sau được thực hiện trên cùng một kết nối sẽ không bị ảnh hưởng bởi thay đổi này.

1

Tôi tìm thấy cách để có được điều này trong một bảng tùy chọn người dùng ở nơi khác và chuyển đổi nó để chỉ nhận dạng ngày. Nó có thể hữu ích cho người khác (lưu ý rằng họ có nhiều cài đặt khác trong cùng một bảng để bạn có thể kiểm tra xem ansi_null có được đặt và nhiều thứ khác theo cùng cách không):

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 
Các vấn đề liên quan