2013-12-12 16 views
0

我有一個帶有生日字段的用戶表,並且我正在嘗試獲取今天生日的所有用戶ID。困難的部分是考慮國家和DST之間的時差。通過時差和DST獲得世界各地的生日

這是我到目前爲止有:

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,並根據他們的帳單國家知道用戶的位置。

+1

你也存儲用戶的地理位置?如果您將GMT(格林威治標準時間)與用戶位置結合使用,您可以在午夜時間將其發送給他們。 –

+0

你一定需要知道用戶的地理位置或時區。你是否在你的用戶表中存儲了某個地方? – Shiva

+0

我們有一個法案國家,我們用它來確定他們的位置。有些也有賬單狀態,但不是全部。 –

回答

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, [email protected], 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

+0

用戶的生日存儲爲沒有時間戳或時區的日期,但這會使事情變得更容易。所以將它們轉換爲服務器時間沒有任何好處。我能想到的唯一一個與他們的法案國家有關聯的地方。 –

+0

添加一個帶有datetimeoffset的附加列或表。按國家調整時區。那麼你將成爲當天的英雄! –