有没有办法查询当前使用T-SQL的SQL Server 2005当前的DATEFORMAT?
我有一个应用程序,它读取预生成的INSERT语句并对数据库执行它们。为了使数据与文化无关,我存储了在不变文化中表示的日期时间值(月/日/年......)。数据库服务器可以在不同的语言环境下运行,具体取决于系统区域设置(可能使用日/月/年),因此插入可能会崩溃,因为无法解析日期时间。
我知道T-SQL中有“SET LANGUAGE”和“SET DATEFORMAT”语句来设置要使用的语言环境。
我不想让这些更改成为永久性的(它们是永久性的吗?),所以我正在寻找一种方法从DB读取DATEFORMAT,存储它,将格式更改为我喜欢的并将其重置为存储的值后已插入数据。
在服务器中找到该值的任何想法?
答案 0 :(得分: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 :(得分:5)
设置语言和设置DateFormat仅影响当前会话。如果断开与数据库的连接并再次连接,则语言和Dateformat将恢复为默认值。
您可以使用'技巧'来确定DateFormat是m / d / y还是d / m / y。
Select DatePart(Month, '1/2/2000')
这个日期无论哪种方式都有效。它是1月2日或2月1日。如果此查询返回1,那么您有MDY。如果它返回2,则表示您有DMY。
答案 2 :(得分:4)
sys.dm_ exec_sessions中的date_ format列怎么样?
您始终可以查看自己的会话,因此不需要服务器级权限
答案 3 :(得分:1)
如果还不太晚,请将您的日期作为YYYYMMDD提交给SQL Server,无论DMY或MDY日期格式设置如何,它们都将被正确插入
SET DATEFORMAT也不是永久性的。根据我的经验,它会影响特定的连接。有些人只说会话,但我发现如果连接返回到池并在丢失之前重新使用,那么它会保留由前一个用户设置的dateformat设置。
答案 4 :(得分: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