【问题标题】:Time Zone Changes CST and DST in sql Server时区更改 sql Server 中的 CST 和 DST
【发布时间】:2014-04-15 06:51:55
【问题描述】:

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

datediff(ss, '1/1/1970', current_timestamp)

现在是格林威治标准时间吗?

要求:

在 CST 和 DST 时间戳中返回时间戳的用户定义函数取决于当前时间(CST 或夏令时)。

在 CST 时区,即“该区的 CST 时间比格林威治标准时间晚 6 小时”

(datediff(ss, '1/1/1970', current_timestamp) + 21600)

在夏令时 (DST) 期间,该区域的时间比格林威治标准时间晚 5 小时

(datediff(ss, '1/1/1970', current_timestamp) + 18000)

谁能帮我为上述要求创建一个用户定义的函数。

感谢和问候, 文卡特

【问题讨论】:

  • 通常更好的是,一旦涉及时区,只在数据库中存储和处理 UTC 值,并将任何区域摆弄到系统中直接从用户那里获取输入或呈现输出的部分给他们。
  • 对,这里的问题是我们正在从 sql server 端(后端)更新列数据。 last_update_date = (datediff(ss, '1/1/1970', current_timestamp) + 18000) 或 (datediff(ss, '1/1/1970', current_timestamp) + 21600) 取决于当前时区。我们始终是 CST 时区。如果是夏令时,我们必须使用 last_update_date = (datediff(ss, '1/1/1970', current_timestamp) + 18000) 进行更新。如果是正常 CST last_update_date = (datediff(ss, '1/1/1970', current_timestamp) + 21600)。帮我创建一个用户定义的函数。
  • 明确您的条款。时间戳不是日期。 current_timestamp 的数据类型是什么。 DATEDIFF 返回一个 int。 msdn.microsoft.com/en-US/library/ms189794(v=SQL.105).aspx
  • 我只需要一个像这样的用户定义函数 Create function myfucntion () { if (TImezone = 'DST') select (datediff(ss, '1/1/1970', current_timestamp) + 18000 ); else (datediff(ss, '1/1/1970', current_timestamp) + 21600) }

标签: sql-server tsql sql-server-2012


【解决方案1】:

不清楚您在问什么,但如果您想将 UTC 转换为 CST,请尝试使用“-6”作为您的 UTC 偏移量。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-22
    • 2021-03-23
    • 2014-11-19
    • 1970-01-01
    • 2011-04-17
    • 1970-01-01
    • 1970-01-01
    • 2019-05-06
    相关资源
    最近更新 更多