.NET TimeZoneInfo类很棒,我认为它将在SQL 2005数据库中记录来自多个时区的数据来回答我所有的问题。

要将数据库中的UTC日期时间转换为任何其他时区,我只需使用TimeZoneInfo.FindSystemTimeZoneById()将时区转换为TimeZoneInfo类,然后调用TimeZoneInfo.ConvertTimeFromUtc()。杰出的!我只是从SQL .NET CLR调用它!

但是... TimeZoneInfo具有MayLeakOnAbort的主机保护属性。

当我使用VS 2008创建SQL函数或存储过程时,我什至看不到system.TimeZoneInfo类永远不要使用它。我还假设即使我能以某种方式引用TimeZoneInfo类,如果尝试在SQL Sever 2005中注册程序集,也可能会遇到某种安全异常。

帮助!有什么方法可以从SQL Server 2005中访问TimeZoneInfo类及其所有资源?

注意:我刚刚在第一个答案之后添加了此警告:

我们在世界各地的不同地点都有站点。我们需要针对可能需要在站点级别趋势化的事件将本地时间和UTC时间存储在数据库中。一个趋势一年可能包含超过52,000个数据点,因此,为了提高效率,我不能仅将时间存储在数据库中的UTC中并转换客户端上的每个数据点。因此,我需要数据库中具有将任何时区中的本地时间与UTC时间之间来回转换的能力。

最佳答案

我刚刚在SQL 2008数据库上完成了此操作。

首先,我必须将数据库设置为可信任,并验证所有者是否正确。

use [myDB]
go
alter database [myDB] set trustworthy on
go

exec sp_changedbowner 'sa'
go

接下来,我创建了一个.NET解决方案
Imports System
Imports System.Data
Imports System.Data.SqlClient
Imports System.Data.SqlTypes
Imports Microsoft.SqlServer.Server
Imports System.Collections.ObjectModel
Imports System.Runtime.InteropServices

Partial Public Class StoredProcedures
    <Microsoft.SqlServer.Server.SqlProcedure()> _
    Public Shared Sub sp_ConvertTime(ByVal UTCTime As DateTime, ByVal ZoneID As String, <Out()> ByRef Output As DateTime)
    Dim sp As SqlPipe = SqlContext.Pipe

    Dim ConvertedTime As DateTime
    Dim tzUTC = TimeZoneInfo.FindSystemTimeZoneById("UTC")
    Dim tzNew = TimeZoneInfo.FindSystemTimeZoneById(ZoneID)

    ConvertedTime = TimeZoneInfo.ConvertTime(UTCTime, tzUTC, tzNew)

    Output = ConvertedTime
    sp.Send(ConvertedTime)

    ConvertedTime = Nothing
    tzUTC = Nothing
    tzNew = Nothing
    sp = Nothing

End Sub
End Class

在部署之前,我将权限级别设置为不安全

接下来,我将其部署了,检查了“输出”窗口中是否存在构建错误并进行了更正。

这是SQL测试
DECLARE @UTCTime datetime
DECLARE @ZoneID varchar(21)
DECLARE @NewTime datetime

SET @UTCTime = GETUTCDATE()
SET @ZoneID = 'Central Standard Time'

exec sp_ConvertTime @UTCTime, @ZoneID, @NewTime OUTPUT
select @NewTime AS NewTime

关于asp.net - 从SQL 2005 Server访问TimeZoneInfo,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/614600/

10-10 16:41