我有用户创建的记录,我将创建日期以UTC格式存储在sql数据库中。
我想允许用户在UI上选择一个日期来拉取当天的记录。
我的当地时间是UTC时间的-4:00。所以这是我的问题:
如果用户在当地时间上午9:00(UTC时间下午1:00)创建了记录,然后在当地时间晚上10:00(第二天上午2:00)创建了另一条记录,我该如何查询这些记录当他们选择那一天?
记录以UTC格式存储,因此它们分为两天,但它们实际上是当地时间的同一天。
我该如何解决这个问题?我是否应该以UTC格式存储记录?
由于
答案 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