【问题标题】:Setting and resetting the DATEFORMAT in SQLServer 2005在 SQL Server 2005 中设置和重置日期格式
【发布时间】:2008-11-20 14:35:16
【问题描述】:
有没有办法查询当前 DATEFORMAT SQLServer 2005 当前与 T-SQL 一起使用?
我有一个应用程序可以读取预生成的 INSERT 语句并针对数据库执行它们。为了使插入的数据独立于文化,我存储了以不变文化 (月/日/年...) 表示的日期时间值。数据库服务器可能在不同的语言环境下运行,具体取决于系统语言环境(可能使用日/月/年),因此插入可能会因为无法解析日期时间而崩溃。
我知道 T-SQL 中有“SET LANGUAGE”和“SET DATEFORMAT”语句来设置要使用的语言环境。
我不想使这些更改永久化(它们是永久的吗?),所以我正在寻找一种从数据库中读取 DATEFORMAT 的方法,将其存储,将格式更改为我喜欢的格式,然后将其重置为存储的值数据已插入。
有什么想法可以在服务器中找到该值吗?
【问题讨论】:
标签:
sql
sql-server
sql-server-2005
tsql
datetime
【解决方案1】:
以下语句将使用给定的日期格式(@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;
请注意,日期格式更改仅适用于当前连接。重新启用原始日期格式只是为了确保以后在同一连接上执行的语句不受此更改的影响。
【解决方案2】:
设置语言和设置日期格式仅影响当前会话。如果您从数据库断开连接并再次连接,则语言和日期格式将设置回它们的默认值。
您可以使用一个“技巧”来确定 DateFormat 是 m/d/y 还是 d/m/y。
Select DatePart(Month, '1/2/2000')
无论哪种方式,此日期均有效。现在是 1 月 2 日或 2 月 1 日。如果此查询返回 1,那么您有 MDY。如果它返回 2,则您有 DMY。
【解决方案3】:
sys.dm_exec_sessions 中的 date_format 列呢?
您始终可以查看自己的会话,因此不需要服务器级别的权限
【解决方案4】:
如果为时不晚,请将您的日期作为 YYYYMMDD 提交到 SQL Server,无论 DMY 或 MDY 日期格式设置如何,它们都将始终正确插入
SET DATEFORMAT 也不是永久性的。以我的经验,它会影响那个特定的连接。有人说只有会话,但我发现如果连接返回到池并在丢失之前重新使用,那么它会保留以前用户设置的日期格式设置。
【解决方案5】:
我找到了一种在其他地方的用户选项表中获取此信息的方法,并将其转换为仅获取日期格式。它可能对其他人有用(注意它们是同一张表中的各种其他设置,因此您可以检查是否设置了 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