SQL Server中是否有任何与当前\u时区\u ID等效的函数
SQL Server中是否有任何等效函数 在SQLServer中,通过这样读取注册表项来读取当前时区id是一种很糟糕的方法 但由于安全限制,我无法读取服务器中的注册表,我个人也不喜欢该解决方案 对于SQL Server,我找不到任何与此类似的直接方法或函数 有吗?看看SQL Server中是否有任何与当前\u时区\u ID等效的函数,sql,sql-server,tsql,timezone,Sql,Sql Server,Tsql,Timezone,SQL Server中是否有任何等效函数 在SQLServer中,通过这样读取注册表项来读取当前时区id是一种很糟糕的方法 但由于安全限制,我无法读取服务器中的注册表,我个人也不喜欢该解决方案 对于SQL Server,我找不到任何与此类似的直接方法或函数 有吗?看看 select Sysdatetimeoffset() 这将给出服务器相对于UTC的时区偏移量 请注意,也许可以将所有日期存储为UTC,这样,SQL中的您以及开发人员就可以轻松地处理日期并将其转换为本地日期,因为不必猜测服务器在
select Sysdatetimeoffset()
这将给出服务器相对于UTC的时区偏移量
请注意,也许可以将所有日期存储为UTC,这样,SQL中的您以及开发人员就可以轻松地处理日期并将其转换为本地日期,因为不必猜测服务器在亚洲或美国的服务器上输入的数据。服务器时间的默认值为GetDate(),UTC的默认值为GetUtcDate(),这并不难做到
您可以从注册表中读取时区(您将需要打开许多安全问题的权限,但通常不授予该权限),如下所示:
DECLARE @TimeZone VARCHAR(50)
EXEC MASTER.dbo.xp_regread 'HKEY_LOCAL_MACHINE',
'SYSTEM\CurrentControlSet\Control\TimeZoneInformation',
'TimeZoneKeyName',@TimeZone OUT
SELECT @TimeZone
根据您的答案进行更新
如上所述,您可以使用Sysdatetimeoffset(),除非您知道LAT/LONG或能够使用.Net并创建扩展属性,这是通过获取偏移量并将其映射到SQL server中的时区名称来获取近似值的唯一TSQL方法
这里有两个示例,第一个示例获取时区偏移量并将其放入变量中,然后使用偏移量变量查询表
declare @offset sysname
SELECT top(1) @offset = value
from String_Split(cast(Sysdatetimeoffset() as varchar(50)),' ')
order by value;
SELECT [name] FROM sys.time_zone_info where [current_utc_offset]= @offset;
或者使用子查询,基本上有两种方法来做相同的事情
SELECT [name] FROM sys.time_zone_info
where [current_utc_offset] in ( SELECT top(1) value
from String_Split(cast(Sysdatetimeoffset() as varchar(50)),' ')
order by value)
如果您不想读取注册表并且需要精确,则使用CLR用户定义函数并将其部署到数据库中
您可以使用相对较少的代码行完成此操作:
using System;
using System.Data.SqlTypes;
public partial class UserDefinedFunctions
{
[Microsoft.SqlServer.Server.SqlFunction(DataAccess = Microsoft.SqlServer.Server.DataAccessKind.None
,IsDeterministic =true
,SystemDataAccess = Microsoft.SqlServer.Server.SystemDataAccessKind.None
,Name = "TimeZoneName"
)]
public static SqlString TimeZoneName()
{
return new SqlString(TimeZone.CurrentTimeZone.StandardName);
}
}
这里有一个很好的创建、部署等示例
由于您不访问SQL中的任何对象并执行或外部访问,因此所有SQL实例都可以允许这样做,因为这是安全代码我的要求是专门获取时区id。在我的问题中,我提到我不想阅读注册表,因为您发布的解决方案我已经知道了。但是我不想使用那个解决方案。@PawanNogariya,不知何故我一定错过了注册表引用,我已经更新了答案,这有帮助吗?谢谢!但是查询将不起作用,因为两个不同时区的小时偏移量可以相同,因此您的查询将返回多个时区,并且无法知道哪个时区是当前时区。例如,
美国东部标准时间
和特克斯和凯科斯群岛标准时间
具有相同的时区-5,因此对于-5
将出现两条记录,您将永远不知道哪一条是current@PawanNogariya,这就是我写的,你现在只剩下CLR了