首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Server中时区更改CST和DST

Server中时区更改CST和DST
EN

Stack Overflow用户
提问于 2014-03-11 14:58:18
回答 1查看 1.8K关注 0票数 0

Server使用“datediff”函数返回的标准时间是多少?

代码语言:javascript
运行
复制
datediff(ss, '1/1/1970', current_timestamp)

是格林尼治时间吗?

所需经费:

用户定义的函数返回CST和DST时间戳取决于当前时间(CST或日照节约)。

在科技委第一时区,e‘科技委在该区的时间比格林尼治时间晚6小时’。

代码语言:javascript
运行
复制
(datediff(ss, '1/1/1970', current_timestamp) + 21600)

夏令时,区内的时间比格林尼治时间晚5小时。

代码语言:javascript
运行
复制
(datediff(ss, '1/1/1970', current_timestamp) + 18000)

有人能帮我为上面的要求创建一个用户定义的函数吗?

谢谢和问候,文卡特

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-26 21:55:21

不清楚您要求什么,但是如果您想将UTC转换为CST,可以使用"-6“作为您的UTC偏移量。

代码语言:javascript
运行
复制
---------------------------------------------------------------------------------------------------
--Name:     udfToLocalTime.sql
--Purpose:  To convert UTC to local US time accounting for DST
--Author:   Patrick Slesicki
--Date:     3/25/2014
--Notes:    Tested on SQL Server 2008R2 and later.
--          Good only for US States observing the Energy Policy Act of 2005.
--          Function doesn't apply for years prior to 2007.
--          Function assumes that the 1st day of the week is Sunday.
--Tests:        
--          SELECT dbo.udfToLocalTime('2014-03-09 9:00', DEFAULT)
--          SELECT dbo.udfToLocalTime('2014-03-09 10:00', DEFAULT)
--          SELECT dbo.udfToLocalTime('2014-11-02 8:00', DEFAULT)
--          SELECT dbo.udfToLocalTime('2014-11-02 9:00', DEFAULT)
---------------------------------------------------------------------------------------------------
ALTER FUNCTION udfToLocalTime
    (
    @UtcDateTime    AS DATETIME
    ,@UtcOffset     AS INT = -8 --PST
    )
RETURNS DATETIME
AS 
BEGIN
    DECLARE 
        @MyDateTime AS DATETIME
        ,@Year      AS CHAR(4)
        ,@MarTime   AS TIME
        ,@NovTime   AS TIME
        ,@Mar1      AS DATETIME
        ,@Nov1      AS DATETIME
        ,@Mar1Day   AS INT
        ,@Nov1Day   AS INT
        ,@MarDiff   AS INT
        ,@NovDiff   AS INT
        ,@DstStart  AS DATETIME
        ,@DstEnd    AS DATETIME

    SELECT
        @Year       = CONVERT(CHAR(4), YEAR(@UtcDateTime))
        ,@MarTime   = CONVERT(TIME, DATEADD(HOUR, -@UtcOffset, '1900-01-01 02:00'))
        ,@NovTime   = CONVERT(TIME, DATEADD(HOUR, -@UtcOffset - 1, '1900-01-01 02:00'))
        ,@Mar1      = CONVERT(CHAR(16), @Year + '-03-01 ' + CONVERT(CHAR(5), @MarTime), 126)
        ,@Nov1      = CONVERT(CHAR(16), @Year + '-11-01 ' + CONVERT(CHAR(5), @NovTime), 126)
        ,@Mar1Day   = DATEPART(WEEKDAY, @Mar1)
        ,@Nov1Day   = DATEPART(WEEKDAY, @Nov1)

    --Get number of days between Mar 1 and DST start date
    IF @Mar1Day = 1 SET @MarDiff = 7
    ELSE SET @MarDiff = 15 - @Mar1Day

    --Get number of days between Nov 1 and DST end date
    IF @Nov1Day = 1 SET @NovDiff = 0
    ELSE SET @NovDiff = 8 - @Nov1Day

    --Get DST start and end dates
    SELECT 
        @DstStart   = DATEADD(DAY, @MarDiff, @Mar1)
        ,@DstEnd    = DATEADD(DAY, @NovDiff, @Nov1)

    --Change UTC offset if @UtcDateTime is in DST Range
    IF @UtcDateTime >= @DstStart AND @UtcDateTime < @DstEnd SET @UtcOffset = @UtcOffset + 1

    --Get Conversion
    SET @MyDateTime = DATEADD(HOUR, @UtcOffset, @UtcDateTime)
    RETURN @MyDateTime
END
GO
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22329472

复制
相关文章

相似问题

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