处理时区

时间:2013-07-20 09:36:32

标签: sql-server

我有一个数据库视图,可以获取某些工作项的状态。例如,它获取开始日期和结束日期,然后根据GetDate()进行一些数学运算,以返回“Work Remaining”类型的答案。

问题是,数据库服务器在美国,我坐在澳大利亚。

所以,现在的时间是7月20日19点33分,服务器上的GetDate()在20日返回02h33。

如何处理时区?我的userprofile是否应该有时区字段,我在客户端扣除或增加小时数?问题在于一切都需要操纵日期和时间。也就是说,应用程序和任何报告。

我有一个观点,例如,它返回了我特定工作的剩余时间。它使用GETDATE()来计算:

ALTER VIEW [dbo].[vwSprintSummary] AS
SELECT 
    SprintId, 
    SprintName, 
    MIN(DateValue) AS FirstSprintDate,
    MAX(DateValue) AS LastSprintDate,
    SprintEndDate,
    COUNT(DISTINCT PersonId) AS AssignedPeople, 
    COUNT(DISTINCT ProjectResourceId) AS AssignedRoles, 
    SUM(AssignedProductiveHours * CanBurnDown) AS Capacity,
    SUM(CASE WHEN CAST(GETDATE() AS DATE) <= DateValue THEN AssignedProductiveHours* CanBurnDown ELSE 0 END) AS RemainingCapacity
FROM [vwSprintDailyBreakdown]
GROUP BY SprintName, SprintId, SprintStartDate, SprintEndDate
GO

不知何故,我需要将GetDate()更改为'DATEADD ...',这样我才能在正确的时区内获得答案?

在这种情况下,“修正”是将GETDATE()更改为DATEADD(HOUR, 17, GETDATE())

硬编码,我知道,但从本质上讲,这将解决问题。

有没有办法以某种方式告诉服务器我的区域,并让它根据我的位置返回日期?

1 个答案:

答案 0 :(得分:4)

一般来说,以UTC格式存储数据库中的所有信息,并以UTC格式进行所有业务逻辑处理,只转换为表示逻辑层中的本地时区 - 这种方法可以帮助您避免麻烦,意味着数据库服务器可以(并且应该)保持幸福地不知道您的时区。

在我自己的项目中,我倾向于信任网络服务器的时钟而不是数据库服务器的时钟,因此我从不在SQL Server上使用GETUTCDATE(),而是将所有日期和时间作为SQL参数提供,例如:查找“今天下达的订单”的查询将提供其自己的“今天”定义(即通过提供最小和最大日期/时间值)。