【发布时间】:2012-01-13 03:39:50
【问题描述】:
我真的需要一些专家的 SQL 帮助。我正在制作一个存储过程,在我显示它之前一切都很好。存储在数据库中的所有内容都以 UTC 格式存储,但是我们获得了浏览器的 GMT 偏移量,这就是我们确定预定义时间范围的方式。问题是我使用日期来显示,但是由于 GMT 偏移,显示的日期不正确,这让人们感到困惑。我将它显示为一个短日期,这是它被转换的部分:
SELECT
BundleEvent.BundleId,
CAST(BundleEvent.EventDate AS DATE)
FROM dbo.BundleEvent WITH (NOLOCK)
JOIN dbo.BundleUser WITH (NOLOCK)
ON BundleEvent.BundleId = BundleUser.BundleId
WHERE BundleEvent.EventDate >= @StartTimeGmt AND BundleEvent.EventDate <= @EndTimeGmt
AND BundleUser.UserId = CASE WHEN @UserId IS NULL THEN BundleUser.UserId ELSE @UserId END
GROUP BY
BundleEvent.BundleId,
CAST(BundleEvent.EventDate AS DATE)
因为我将它作为一个短日期分组,所以我失去了转换它的能力。因此,当人们选择今天范围时,由于他们的 GMT 偏移量,他们可能会从今天和昨天得到一个日期。以前有没有人遇到过这个问题,如果有,您使用了什么解决方案?因为我正在使用存储过程,所以我非常有限。我不知道如何解决这个问题。
【问题讨论】:
-
如果你想调整时区,你需要的不仅仅是日期,否则没有什么可调整的。您可以预先确定那里的时区,将信息发送到您的选择查询,调整然后转换为 DATE。或者返回完整的 UTC 并以编程方式进行调整。
标签: sql stored-procedures utc