首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何从tsql (SQL2005)中的utc日期时间计算本地日期时间?

如何从tsql (SQL2005)中的utc日期时间计算本地日期时间?
EN

Stack Overflow用户
提问于 2010-08-04 18:34:31
回答 9查看 42.2K关注 0票数 17

我想在tsql中循环一段时间,并打印utc日期时间和我们的本地变量。我们住在UTC +1,所以我可以很容易地增加一个小时,但在夏天我们住在UTC +2。

在C#中,我可以创建一个datetime并使用一个方法来请求UTC变量,反之亦然。

到目前为止,我有这样的想法:

代码语言:javascript
复制
declare @counter int
declare @localdate datetime
declare @utcdate datetime
 set @counter = 0
 while @counter < 100
 begin
   set @counter = @counter + 1
   print 'The counter is ' + cast(@counter as char)
  set @utcdate  = DATEADD(day,@counter,GETUTCDATE())
  --set @localdate = ????

  print  @localdate  
  print @utcdate
 end
EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2010-08-04 20:46:35

假设您使用的是SQL 2005及更高版本,则可以开发一个SQL CLR函数来获取UTC日期并将其转换为本地日期。

This link是一本MSDN操作指南,它解释了如何在C#中创建标量UDF。

创建SQL函数,如下所示

代码语言:javascript
复制
[SqlFunction()]
public static SqlDateTime ConvertUtcToLocal(SqlDateTime utcDate) 
{
    // over to you to convert SqlDateTime to DateTime, specify Kind
    // as UTC, convert to local time, and convert back to SqlDateTime
}

你上面的样本就会变成

代码语言:javascript
复制
set @localdate = dbo.ConvertUtcToLocal(@utcdate)

SQL CLR在部署方面有它的开销,但我觉得像这样的情况最适合它。

票数 6
EN

Stack Overflow用户

发布于 2012-01-13 06:01:50

我已经等了5年了,想要一个更优雅的解决方案,但因为还没有出现,所以我会把我到目前为止一直在使用的东西发布出来。

代码语言:javascript
复制
CREATE FUNCTION [dbo].[UDTToLocalTime](@UDT AS DATETIME)  
RETURNS DATETIME
AS
BEGIN 
--====================================================
--Set the Timezone Offset (NOT During DST [Daylight Saving Time])
--====================================================
DECLARE @Offset AS SMALLINT
SET @Offset = -5

--====================================================
--Figure out the Offset Datetime
--====================================================
DECLARE @LocalDate AS DATETIME
SET @LocalDate = DATEADD(hh, @Offset, @UDT)

--====================================================
--Figure out the DST Offset for the UDT Datetime
--====================================================
DECLARE @DaylightSavingOffset AS SMALLINT
DECLARE @Year as SMALLINT
DECLARE @DSTStartDate AS DATETIME
DECLARE @DSTEndDate AS DATETIME
--Get Year
SET @Year = YEAR(@LocalDate)

--Get First Possible DST StartDay
IF (@Year > 2006) SET @DSTStartDate = CAST(@Year AS CHAR(4)) + '-03-08 02:00:00'
ELSE              SET @DSTStartDate = CAST(@Year AS CHAR(4)) + '-04-01 02:00:00'
--Get DST StartDate 
WHILE (DATENAME(dw, @DSTStartDate) <> 'sunday') SET @DSTStartDate = DATEADD(day, 1,@DSTStartDate)


--Get First Possible DST EndDate
IF (@Year > 2006) SET @DSTEndDate = CAST(@Year AS CHAR(4)) + '-11-01 02:00:00'
ELSE              SET @DSTEndDate = CAST(@Year AS CHAR(4)) + '-10-25 02:00:00'
--Get DST EndDate 
WHILE (DATENAME(dw, @DSTEndDate) <> 'sunday') SET @DSTEndDate = DATEADD(day,1,@DSTEndDate)

--Get DaylightSavingOffset
SET @DaylightSavingOffset = CASE WHEN @LocalDate BETWEEN @DSTStartDate AND @DSTEndDate THEN 1 ELSE 0 END

--====================================================
--Finally add the DST Offset 
--====================================================
RETURN DATEADD(hh, @DaylightSavingOffset, @LocalDate)
END



GO

备注:

这是为观察夏令时的北美服务器准备的。请将变量@Offest更改为运行SQL函数的服务器的时区偏移量(同时不遵守夏令时)...

代码语言:javascript
复制
--====================================================
--Set the Timezone Offset (NOT During DST [Daylight Saving Time])
--====================================================
DECLARE @Offset AS SMALLINT
SET @Offset = -5

随着DST规则的更改,请在此处更新它们。

代码语言:javascript
复制
--Get First Possible DST StartDay
IF (@Year > 2006) SET @DSTStartDate = CAST(@Year AS CHAR(4)) + '-03-08 02:00:00'
ELSE              SET @DSTStartDate = CAST(@Year AS CHAR(4)) + '-04-01 02:00:00'
--Get DST StartDate 
WHILE (DATENAME(dw, @DSTStartDate) <> 'sunday') SET @DSTStartDate = DATEADD(day, 1,@DSTStartDate)


--Get First Possible DST EndDate
IF (@Year > 2006) SET @DSTEndDate = CAST(@Year AS CHAR(4)) + '-11-01 02:00:00'
ELSE              SET @DSTEndDate = CAST(@Year AS CHAR(4)) + '-10-25 02:00:00'
--Get DST EndDate 
WHILE (DATENAME(dw, @DSTEndDate) <> 'sunday') SET @DSTEndDate = DATEADD(day,1,@DSTEndDate)

干杯,

票数 24
EN

Stack Overflow用户

发布于 2011-01-14 14:21:48

这个解决方案似乎太明显了。

如果您可以使用GETUTCDATE()获取UTC日期,并且可以使用GETDATE()获取本地日期,那么您就有了一个可以应用于任何日期时间的偏移量

代码语言:javascript
复制
SELECT DATEADD(hh, DATEPART(hh, GETDATE() - GETUTCDATE()) - 24, GETUTCDATE()) 

这应该返回您执行查询的本地时间,

代码语言:javascript
复制
SELECT DATEADD(hh, DATEPART(hh, GETDATE() - GETUTCDATE()) - 24, N'1/14/2011 7:00:00'  ) 

这将返回2011-01-14 02:00:00.000,因为我在UTC +5

除非我漏掉了什么?

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3404646

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档