1

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

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

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

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

例如,我有一个视图,它返回我某件特定工作的剩余时间。它使用 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())

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

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

4

1 回答 1

4

一般来说,将所有信息以 UTC 格式存储在您的数据库中,并以 UTC 时间进行所有业务逻辑处理,仅在您的表示逻辑层转换为本地时区 - 这种方法将为您省去无穷无尽的麻烦,并且意味着数据库服务器可以(并且应该)完全不知道您的时区。

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

于 2013-07-20T10:20:51.397 回答