如何在SQL Server 2005中转换时区?

时间:2010-07-08 05:16:30

标签: sql sql-server-2005

我所有的时间都在UTC时区现在我需要以某种方式将其转换为用户时区(我也将它存储在数据库中并使用Windows时区的ID)。

如何在SQL Server 2005中执行此操作?

修改

所以我尝试做扩展存储过程但是使用Timezoneinfo我得到了这个错误

  

部署错误SQL01268:.Net SqlClient   数据提供者:Msg 6503,Level 16,   国家12,第1行大会   'system.core,version = 3.5.0.0,   培养=中性   公钥= b77a5c561934e089“。是   在SQL目录中找不到。一个   批处理时发生错误   被执行。

如果我把那条线拿出来我可以部署它。任何想法如何解决这个问题?

5 个答案:

答案 0 :(得分:0)

  

SQL Server不提供简单   将UTC日期时间值转换为的方法   当地时间价值。

但是,the page that is from包括:

  

表(tbTimeZoneInfo)   数据提供时区   信息和两个功能   将UTC日期时间值转换为任何值   当地时区。

答案 1 :(得分:0)

只为你写这个:

DECLARE @UTCDate DateTime /* Replace with the UTC datetime stored in your table */
DECLARE @LocalDate DateTime
DECLARE @TimeZoneOffset int /* Replace with the offset stored in your table */
SET @TimeZoneOffset = -8 /* PST */
SET @UTCDate = GETUTCDATE()
SET @LocalDate = DATEADD(Hour, @TimeZoneOffset, @UTCDate)
SELECT @UTCDate
SELECT @LocalDate

如果它不起作用,请告诉我。

答案 2 :(得分:0)

由于SQL Server不提供对此的开箱即用支持,您可以考虑编写一个使用.Net TimeZoneInfo object的.Net DLL存储过程,此对象会考虑包括DST在内的所有规则。此类允许您将时间从一个区域转换为另一个区域。我希望这会有所帮助。

DateTime hwTime = new DateTime(2007, 02, 01, 08, 00, 00);
try
{
   TimeZoneInfo hwZone = TimeZoneInfo.FindSystemTimeZoneById("Hawaiian Standard Time");
   Console.WriteLine("{0} {1} is {2} local time.", 
           hwTime, 
           hwZone.IsDaylightSavingTime(hwTime) ? hwZone.DaylightName : hwZone.StandardName, 
           TimeZoneInfo.ConvertTime(hwTime, hwZone, TimeZoneInfo.Local));
}
catch (TimeZoneNotFoundException)
{
   Console.WriteLine("The registry does not define the Hawaiian Standard Time zone.");
}                           
catch (InvalidTimeZoneException)
{
   Console.WriteLine("Registry data on the Hawaiian STandard Time zone has been corrupted.");
}

<强> [编辑]

Tutorial Creating Simple .Net DLL stored procedure.

Another useful tutorial, has more detail on deployment.

答案 3 :(得分:0)

SQL Server 2008将具有DATETIMEOFFSET数据类型(包括时区)以及SWITCHOFFSET等函数,以便从一个时区偏移切换到另一个时区偏移。

但在2005版本中,对时区的支持并不多。

你有可能很快升级吗?

答案 4 :(得分:0)

我使用这个功能:

CREATE FUNCTION fnConvertGMTToLocalTime
(
    @GMTValue   Datetime,
    @TimeZoneOffset int
)
RETURNS DateTime
AS
BEGIN
    DECLARE @LocalTime dateTime

    SELECT @LocalTime = DateAdd(Hour, @TimeZoneOffset, @GMTvalue)

    RETURN @LocalTime
END

它不考虑夏令时...但我不需要那样。