Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server中是否有任何与当前\u时区\u ID等效的函数_Sql_Sql Server_Tsql_Timezone - Fatal编程技术网

SQL Server中是否有任何与当前\u时区\u ID等效的函数

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中的您以及开发人员就可以轻松地处理日期并将其转换为本地日期,因为不必猜测服务器在

SQL Server中是否有任何等效函数

在SQLServer中,通过这样读取注册表项来读取当前时区id是一种很糟糕的方法

但由于安全限制,我无法读取服务器中的注册表,我个人也不喜欢该解决方案

对于SQL Server,我找不到任何与此类似的直接方法或函数

有吗?

看看

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了