2015-10-01 92 views
0

在我的表,我有一個包含日期毫秒這樣的柱:轉換日期爲迄今爲止

table a 
     dateinmili 
     1440301846096 //first six month date 
     1443589721039 //second six month date 

我用我的Android設備,它工作正常。當我想在SQL Server的PROCEDURE中使用這段時間並將此時間轉換爲人類時間(對於人類而言可以理解)並且日期有問題時。

我在伊朗,它使用UTC時間在上半年波斯日期個月4.30和3.30的每秒6月份。

對於程序轉換日期我使用此代碼:

CONVERT(nVARCHAR(10),DATEADD(mi, DATEDIFF(mi, GETUTCDATE(), GETDATE()), DATEADD(ss,dateinmili/1000,'1970-01-01')),8) as date 
DATEADD(mi, DATEDIFF(mi, GETUTCDATE(), GETDATE()), DATEADD(ss,dateinmili/1000,'1970-01-01')) as time 

,這裏是我的問題:

當我轉換成每秒6月份和日期在上半年當月同比註冊日期,我在實時和轉換時間之間得到1小時的差異。我知道那是因爲

DATEDIFF(mi, GETUTCDATE(), GETDATE())  

方法,該方法返回UTC時間與本地時間之間的不同當過其所謂的(在我的例子返回3:30 4:30沒有),但我不知道我怎麼能解決這個問題?

我可以添加包含當前UTC時間的列,但我正在尋找另一種方式。

更新

我看到this question,這不是我的問題轉換長至今。
我的問題是在我的國家UTC時間是不是在全年和3.30和4.30之間的變化不斷,比如我有日期在上半年月登記(波斯6個月),如1440271800000,現在我們都在每秒6將其轉換月(波斯六個月),並使用此代碼進行轉換。

declare @unixTS bigint 
set @unixTS = 1440271800000 

select dateadd(ms, @unixTS%(3600*24*1000), 
    dateadd(day, @unixTS/(3600*24*1000), '1970-01-01 03:30:00.0') 
) 

我得到這個

2015-08-22 23:00:00.000  

,但它是不正確的日期;正確的日期是:

2015-08-23 00:00:00.000 

因爲當時間註冊UTC爲4.30和3.30不知道,但是當我轉換 它UTC是3.30。

我希望如果有一種方法在SQL中返回過去的UTC時間不同;我的意思是把一個日期,並返回當地時間和gmt時間不同,我的問題解決了。

我希望你能理解我的問題。

+0

你是什麼意思「date in milliseconds」?這通常是一個Uni/Linux時間戳,它是特定時間以來的毫秒數,例如1/1/1970。你需要知道基準時間(即0代表什麼),以處理這個日期。如果這確實是一個Unix時間戳,那麼您只需要將基準日期的數目加上ms。這些時間戳對應哪些日期? –

+0

PS沒有「人性化的時間」,操作系統的不同部分可能會使用不同類型的「相同」事物。 Unix時間戳可以用於文件創建/修改日期,但它完全不適合代表任意日期,更不用說處理時區 –

+0

[將unix時期時間戳轉換爲TSQL時間戳](http://stackoverflow.com/questions/14507649/轉換-UNIX的劃時代的時間戳到TSQL時間戳) – Ben

回答

0

在美國,我們有夏令時在夏天,在大部分地區,這意味着,我們也沒有固定的UTC的偏移量。 MS Dynamics CRM的舊版本用於保存UTC中的所有內容,因此當我們想在當地時間導出數據時,我們進行了類似的練習。我創建了一組SQL函數,它們將採用標準GMT偏移量和日期時間來轉換並計算是否應用標準或DST偏移量並返回本地日期時間。如果你的偏移量遵循一組規則,那麼你可以修改這個:

CREATE function [dbo].[DC_GMTtoLocal] 
    (@OrigGMT datetime, 
@StandardOffset int) 
RETURNS datetime 
AS 
BEGIN 
DECLARE @RevDate datetime 

set @RevDate = CASE dbo.DC_DaylightSavingTime_IsInEffect(@OrigGMT) 
    WHEN 1 THEN DATEADD(hour, - @StandardOffset + 1, @OrigGMT) -- in DST 
    ELSE DATEADD(hour, - @StandardOffset, @OrigGMT) -- Not In DST 
    END 

return @RevDate 
END 


GO 

SET ANSI_NULLS ON 
GO 

SET QUOTED_IDENTIFIER ON 
GO 

CREATE function [dbo].[DC_DaylightSavingTime_IsInEffect] 
(@DtTime datetime) 
RETURNS tinyint 
AS 
BEGIN 
DECLARE @DLSStart datetime 
, @DLSEnd datetime 
, @DLSActive tinyint 

SET @DLSActive = 0 
If DATEADD(YEAR,3,GETDATE()) > @DtTime 
BEGIN 
    SET @DLSStart =(SELECT dbo.DC_GetDaylightSavingsTimeStart(CONVERT(varchar,DATEPART(YEAR,@DtTime)))) 
    SET @DLSEnd =(SELECT dbo.DC_GetDaylightSavingsTimeEnd(CONVERT(varchar,DATEPART(YEAR,@DtTime)))) 


    IF @DtTime BETWEEN @DLSStart AND @DLSEnd 
    BEGIN 
     SET @DLSActive = 1 
    END 
     --SET @DLSActive = 0 
END 

RETURN @DLSActive 
END 

GO 

CREATE function [dbo].[DC_GetDaylightSavingsTimeStart] 
(@Year varchar(4)) 
RETURNS smalldatetime 
as 
--Start date: We evaluate the day of the week corresponding to the first day of the month and find the second Sunday of March using a Case statement 
begin 
declare @DTSStartWeek smalldatetime, @DTSEndWeek smalldatetime 
set @DTSStartWeek = '03/01/' + convert(varchar,@Year) 
return case datepart(dw,@DTSStartWeek) 
when 1 then 
dateadd(hour,170,@DTSStartWeek) 
when 2 then 
dateadd(hour,314,@DTSStartWeek) 
when 3 then 
dateadd(hour,290,@DTSStartWeek) 
when 4 then 
dateadd(hour,266,@DTSStartWeek) 
when 5 then 
dateadd(hour,242,@DTSStartWeek) 
when 6 then 
dateadd(hour,218,@DTSStartWeek) 
when 7 then 
dateadd(hour,194,@DTSStartWeek) 
end 
end 


GO 

CREATE function [dbo].[DC_GetDaylightSavingsTimeEnd] 
(@Year varchar(4)) 
RETURNS smalldatetime 
as 
-- End date: We evaluate the day of the week corresponding to the first day of the month and find the first Sunday of March using a Case statement 
begin 
declare @DTSEndWeek smalldatetime 
set @DTSEndWeek = '11/01/' + convert(varchar,@Year) 
return case datepart(dw,dateadd(week,1,@DTSEndWeek)) 
when 1 then 
dateadd(hour,2,@DTSEndWeek) 
when 2 then 
dateadd(hour,146,@DTSEndWeek) 
when 3 then 
dateadd(hour,122,@DTSEndWeek) 
when 4 then 
dateadd(hour,98,@DTSEndWeek) 
when 5 then 
dateadd(hour,74,@DTSEndWeek) 
when 6 then 
dateadd(hour,50,@DTSEndWeek) 
when 7 then 
dateadd(hour,26,@DTSEndWeek) 
end 
end 


GO