我有一个数据库视图,可以获取某些工作项的状态。例如,它获取开始日期和结束日期,然后根据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())
硬编码,我知道,但从本质上讲,这将解决问题。
有没有办法以某种方式告诉服务器我的区域,并让它根据我的位置返回日期?
答案 0 :(得分:4)
一般来说,以UTC格式存储数据库中的所有信息,并以UTC格式进行所有业务逻辑处理,只转换为表示逻辑层中的本地时区 - 这种方法可以帮助您避免麻烦,意味着数据库服务器可以(并且应该)保持幸福地不知道您的时区。
在我自己的项目中,我倾向于信任网络服务器的时钟而不是数据库服务器的时钟,因此我从不在SQL Server上使用GETUTCDATE()
,而是将所有日期和时间作为SQL参数提供,例如:查找“今天下达的订单”的查询将提供其自己的“今天”定义(即通过提供最小和最大日期/时间值)。