asp.net - 从 SQL 2005 Server 访问 TimeZoneInfo

标签 asp.net sql sql-server clr timezone

.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/

相关文章:

sql - 查询当天多笔交易

sql - 如何更新表格以在数字的固定位置插入小数点?

c# - TSQL - 从具有多个连接路径的表中选择

css - 两个没有换行符的内联表

php - 带十进制值的 MySQL SELECT

sql - 了解 WHERE 如何与 GROUP BY 和聚合配合使用

java - 标准与标准之间的逻辑或

c# - 在 ASP.NET 网页中打开 PDF

javascript - 长时间运行的异步 API 方法

c# - 每个浏览器进程/选项卡的 HttpSessionState.SessionID 属性是否唯一?