以UTC时间存储时从SQL数据库获取今日记录

时间:2016-05-11 14:01:21

标签: sql-server datetime

我有用户创建的记录,我将创建日期以UTC格式存储在sql数据库中。

我想允许用户在UI上选择一个日期来拉取当天的记录。

我的当地时间是UTC时间的-4:00。所以这是我的问题:

如果用户在当地时间上午9:00(UTC时间下午1:00)创建了记录,然后在当地时间晚上10:00(第二天上午2:00)创建了另一条记录,我该如何查询这些记录当他们选择那一天?

记录以UTC格式存储,因此它们分为两天,但它们实际上是当地时间的同一天。

我该如何解决这个问题?我是否应该以UTC格式存储记录?

由于

2 个答案:

答案 0 :(得分:1)

是否总是存在-4小时差异,或者您是否有来自不同时区的多个用户?如果第一个适用,请考虑dateadd。例如:

SELECT dateadd(hour, -4, yourTimeStamp) as TimeStamp
, CAST(dateadd(hour, -4, yourTimeStamp) as DATE) as DateOfTimeStamp
FROM YourTable
WHERE CAST(dateadd(hour, -4, yourTimeStamp) as DATE) = '20160510'

编辑: 您可以使用:

SELECT DATEDIFF(MINUTE, SYSDATETIME(), GETDATE()) AS MinutesOffsetUTCtoLocal

获取客户端和计算机之间的时间差。整合这个看起来像这样:

SELECT dateadd(minute, DATEDIFF(MINUTE, SYSDATETIME(), GETDATE()), yourTimeStamp) as TimeStamp
, CAST(dateadd(minute, DATEDIFF(MINUTE, SYSDATETIME(), GETDATE()), yourTimeStamp) as DATE) as DateOfTimeStamp
FROM YourTable
WHERE CAST(dateadd(minute, DATEDIFF(MINUTE, SYSDATETIME(), GETDATE()), yourTimeStamp) as DATE) = '20160510'

答案 1 :(得分:0)

我建议使用以下列构建一个日历表(对其他事情也很方便) - 在我的示例中,它被称为:local_calendar

local_date      DATE     -- This marks the day (without time)
date_starts_utc DATETIME -- Local midnight converted to UTC
date_ends_utc   DATETIME -- Local midnight of the next day converted to UTC.

在合理的日期范围内填写此表格。

从现在开始,您可以将此表连接到任何UTC时间,以获取本地日期和任何本地日期到时间边界。

获取utc时间的本地日期

SELECT local_date
FROM local_calendar
WHERE @utcTime >= date_starts_utc AND @utcTime < date_ends_utc

获取本地日期的UTC边界

SELECT @lowerBoundary = date_starts_utc, @higherBoundary = date_ends_utc
FROM local_calendar
WHERE date = @localDate