通过时差和夏令时在全球范围内举办生日

时间:2013-12-12 20:14:30

标签: sql-server

我有一个带有生日字段的用户表,我正在尝试获取今天生日所在的所有用户ID。困难的部分是考虑国家和夏令时之间的时差。

这是我到目前为止所做的:

SELECT *
FROM Users WITH(NOLOCK)
WHERE MONTH(Birthday) = MONTH(GETDATE())
AND DAY(Birthday) BETWEEN DAY(GETDATE()) - 2 AND DAY(GETDATE()) + 2

我包括 - / + 2天,以确保我可以为可能比我们的服务器时间提前或延迟几个小时的人生日。我不知道从哪里开始。

如何确保找到合适的用户?

修改 我正在使用SQL Server 2005,并根据其帐单国家/地区了解用户的位置。

2 个答案:

答案 0 :(得分:0)

你可能需要使用datetimeoffset来解决它: http://msdn.microsoft.com/en-us/library/bb630289.aspx

答案 1 :(得分:0)

以下示例在[tempdb]中创建一个具有48小时日期的测试表。

如果我的服务器在GMT时间运行,我可以通过使用抵消将常量归零来将表中存储的所有日期转换为GMT。

-- Just playing around
use tempdb;
go

-- A simple table with dates
create table my_birthday
(
  -- simple id
  my_id int identity(1,1) primary key,

  -- store date with offset
  my_date datetimeoffset
);

-- Data with GMT offset
declare @cnt int = -48;
while @cnt < 49
begin
  insert into my_birthday (my_date) values ( DATEADD(HH, -@cnt, SYSDATETIMEOFFSET()) );
  set @cnt += 1;
end;

-- Pick todays data
select * from my_birthday 
where datediff(d, my_date, switchoffset(CONVERT(datetimeoffset, '2013-12-12'), '+00:00') ) = 0

观察输出,我们在美国东部时间的时区12-11上多加5天,在一天结束时松了5天。但我们仍然只能得到24小时,这是正确的。

简而言之,您需要此解决方案的datetimeoffset数据类型和switchoffset()函数。

enter image description here