SQL सर्वर में मैं bigint (UNIX टाइमस्टैम्प) को डेटाइम में कैसे बदल सकता हूँ?


जवाबों:


58

प्रयत्न:

CREATE FUNCTION dbo.fn_ConvertToDateTime (@Datetime BIGINT)
RETURNS DATETIME
AS
BEGIN
    DECLARE @LocalTimeOffset BIGINT
           ,@AdjustedLocalDatetime BIGINT;
    SET @LocalTimeOffset = DATEDIFF(second,GETDATE(),GETUTCDATE())
    SET @AdjustedLocalDatetime = @Datetime - @LocalTimeOffset
    RETURN (SELECT DATEADD(second,@AdjustedLocalDatetime, CAST('1970-01-01 00:00:00' AS datetime)))
END;
GO

2
UTC-> स्थानीय रूपांतरण के लिए +1। ध्यान दें कि यदि आप 10 जून को फरवरी के दौरान अनुवाद करने का प्रयास करते हैं, तो गर्मी / सर्दी अभी भी बंद रहेगी।
एंडोमर

11
UTC-> स्थानीय रूपांतरण के लिए -1। यह डेलाइट सेविंग टाइम को सही तरीके से हैंडल नहीं कर रहा है। मेरे लिए, यह भ्रामक है।
पावेल हॉरल

रचनात्मक समाधान के लिए +1! बहुत अच्छा काम करता है। FYI करें, SQL में एक सिंटैक्स त्रुटि है। पहली "DECLARE" लाइन के अंत में अर्ध-बृहदान्त्र को कॉमा के बाद से हटा दिया जाना चाहिए।
सेठ १

2
यह मेरे लिए काम नहीं करता है। मैं इसे 1517270400000 के साथ आज़मा रहा हूँ और इस त्रुटि को प्राप्त कर रहा हूँ: अंकगणितीय अतिप्रवाह त्रुटि डेटा को int में अभिव्यक्ति परिवर्तित करना।
डेनिश

1
इसके अलावा एक अतिप्रवाह हो रहा था, सामान्य तौर पर इसका मतलब है कि मिलीसेकंड शामिल हैं, बस के रूप में हल किया गया है: src_table से dbo.fn_ConvertToDateTime (src_column / 1000) का चयन करें;
access_granted

304

यह मेरे लिए काम किया:

Select
    dateadd(S, [unixtime], '1970-01-01')
From [Table]

किसी भी एक चमत्कार के कारण 1970-01-01, इसे युग कहा जाता है ।

नीचे विकिपीडिया से एक उद्धरण दिया गया है:

00:00:00 समन्वित यूनिवर्सल टाइम (UTC), गुरुवार, 1 जनवरी 1970, [1] [नोट 1] के बाद से समाप्त होने वाले सेकंड की संख्या लीप सेकंड की गिनती नहीं।


17
इसे सही के रूप में चिह्नित किया जाना चाहिए। काश मैं हर बार जब मैं यहां
उतरता

2
@BenDundee मैं वास्तव में आपसे सहमत हूँ। क्या एक सुंदर समाधान है। मैंने एक फार्मूले के लिए सभी को देखा और आखिरकार एक पर बस गया जब मुझे एक सप्ताह बाद त्रुटियों में भागना शुरू करना पड़ा। शुक्र है कि मुझे यह दूसरी बार के आसपास मिला।
यह उतार चढ़ाव भरा

1
मैं इस समाधान का उपयोग कर रहा हूं। यह स्वरूपित तिथि अन्य डेटा के साथ समवर्ती थी, इसलिए मेरे पास एक वर्चर था ... आसान! आवेदन में उन लॉग को प्रारूपित करने के लिए परेशान करने की आवश्यकता नहीं है। हालाँकि, कुछ जंगली समय क्षेत्र समस्याएं दिखाई दीं! मेरी तारीखें ग्राहक के समय क्षेत्र के बजाय UTC समय क्षेत्र का उपयोग कर रही थीं :(
gustavohenke

2
अगर आप पहले से ही अपनी समस्या को हल कर रहे हैं, तो @hitecat नहीं जानते, लेकिन केसिंग देखें! हो सकता है कि आपका डेटाबेस कोलाज सेटिंग 'SQL_Latin1_General_CP1_CS_AS' की तरह सेट हो, CS यहाँ कीवर्ड है। यह "CaseSensitiv" के लिए है, क्योंकि आपका कोड आवरण से मेल खाना चाहिए! एक और बिंदु यह हो सकता है कि आपका सिस्टम MySql है, जैसा कि नाम date_add () है। सादर;)
रात

3
यह समाधान वर्ष 2038 की समस्या से प्रभावित होगा क्योंकि डेटाड फ़ंक्शन को एक इंट प्रकार की आवश्यकता होती है। दस्तावेज़ कहता है "संख्या तर्क int की सीमा से अधिक नहीं हो सकता है।" docs.microsoft.com/en-us/sql/t-sql/functions/… en.wikipedia.org/wiki/Year_2038_problem
Patrick H

30

अगर किसी को नीचे त्रुटि हो रही है:

अंकगणितीय अतिप्रवाह त्रुटि अभिव्यक्ति को डेटा प्रकार int में परिवर्तित करना

यूनिक्स टाइमस्टैम्प के कारण बिगिंट (इंट के बजाय) में है, आप इसका उपयोग कर सकते हैं:

SELECT DATEADD(S, CONVERT(int,LEFT(1462924862735870900, 10)), '1970-01-01')
FROM TABLE

अपने वास्तविक कॉलम के लिए हार्डकोड टाइमस्टैम्प को यूनिक्स-टाइमस्टैम्प से बदलें

स्रोत: MSSQL बिगिन्ट यूनिक्स टाइमस्टैम्प से डेटाटाइम तक मिलीसेकंड के साथ


दिए गए युगांतरों को देखते हुए, और भी बेहतर: SELATE DATEADD (ms, 1517270454852% 1000, DATEADD (S, 1517270454852/1000, '1970-01-01'))
G DeMasters

25

ऐशे ही

सेकंड में आधार तिथि के लिए यूनिक्स (युग) को जोड़ें

यह अब के लिए मिल जाएगा (2010-05-25 07: 56: 23.000)

 SELECT dateadd(s,1274756183,'19700101 05:00:00:000')

यदि आप रिवर्स जाना चाहते हैं, तो इस http://wiki.lessthandot.com/index.php/Epp__ate पर एक नज़र डालें


1
क्यों 00:00:00 के बजाय 05:00 बजे?
Svisstack

2
@ 5 घंटे का समय टाइमजोन अंतर के लिए है। 5:00:00 का मतलब है कि वह GMT-5 घंटे है
जॉर्डन वैन Eijk

एक जादू की तरह काम करता है। यदि आपको
टाइमज़ोन के

7

यह यह करेगा:

declare @UNIX_TIME int
select @UNIX_TIME = 1111111111
-- Using dateadd to add seconds to 1970-01-01
select [Datetime from UNIX Time] = dateadd(!precision!,@UNIX_TIME,'1970-01-01')

बजाय सटीक! उपयोग: एसएस, एमएस या एमकेएस टाइमस्टैम्प की शुद्धता के अनुसार। Bigint microsecond परिशुद्धता धारण करने में सक्षम है।



4

N सेकंड जोड़ने से 1970-01-01आप एक UTC तिथि प्राप्त कर सकते हैं क्योंकि n , Unix टाइमस्टैम्प, उन सेकंड की संख्या है जो 00:00:00 समन्वित यूनिवर्सल टाइम (UTC), गुरुवार, 1 जनवरी 1970 से समाप्त हो गए हैं

SQL Server 2016 में, आप एक समय क्षेत्र को दूसरे का उपयोग करके परिवर्तित कर सकते हैं AT TIME ZONE। आपको बस Windows मानक प्रारूप में समय क्षेत्र का नाम जानने की आवश्यकता है:

SELECT *
FROM (VALUES (1514808000), (1527854400)) AS Tests(UnixTimestamp)
CROSS APPLY (SELECT DATEADD(SECOND, UnixTimestamp, '1970-01-01') AT TIME ZONE 'UTC') AS CA1(UTCDate)
CROSS APPLY (SELECT UTCDate AT TIME ZONE 'Pacific Standard Time') AS CA2(LocalDate)
| UnixTimestamp | UTCDate                    | LocalDate                  |
|---------------|----------------------------|----------------------------|
| 1514808000    | 2018-01-01 12:00:00 +00:00 | 2018-01-01 04:00:00 -08:00 |
| 1527854400    | 2018-06-01 12:00:00 +00:00 | 2018-06-01 05:00:00 -07:00 |

या केवल:

SELECT *, DATEADD(SECOND, UnixTimestamp, '1970-01-01') AT TIME ZONE 'UTC' AT TIME ZONE 'Pacific Standard Time'
FROM (VALUES (1514808000), (1527854400)) AS Tests(UnixTimestamp)
| UnixTimestamp | LocalDate                  |
|---------------|----------------------------|
| 1514808000    | 2018-01-01 04:00:00 -08:00 |
| 1527854400    | 2018-06-01 05:00:00 -07:00 |

टिप्पणियाँ:

  • आप कास्टिंग द्वारा समय क्षेत्र जानकारी बंद काटना कर सकते हैं DATETIMEOFFSETकरने के लिए DATETIME
  • रूपांतरण दिन की बचत समय को ध्यान में रखता है। प्रशांत समय UTC-08: 00 जनवरी 2018 को और UTC-07: 00 Jun 2018 को था।

3

यदि समय मिलीसेकंड में है और उन्हें संरक्षित करने की आवश्यकता है:

DECLARE @value VARCHAR(32) = '1561487667713';

SELECT DATEADD(MILLISECOND, CAST(RIGHT(@value, 3) AS INT) - DATEDIFF(MILLISECOND,GETDATE(),GETUTCDATE()), DATEADD(SECOND, CAST(LEFT(@value, 10) AS INT), '1970-01-01T00:00:00'))

1

यह काम इस सवाल के लिए डैनियल लिटिल ने किया, लेकिन दिन के उजाले की बचत के समय (दिनांक 01-01 1902 के लिए काम करता है और डेटेड फ़ंक्शन पर अंतर सीमा के कारण अधिक से अधिक) का निर्माण कर रहा है:

हमें पहले एक तालिका बनाने की आवश्यकता है जो दिन के उजाले की बचत समय के लिए तिथि सीमा को संग्रहीत करेगा (स्रोत: संयुक्त राज्य अमेरिका में समय का इतिहास ):

CREATE TABLE [dbo].[CFG_DAY_LIGHT_SAVINGS_TIME](
  [BEGIN_DATE] [datetime] NULL,
  [END_DATE] [datetime] NULL,
  [YEAR_DATE] [smallint] NULL
) ON [PRIMARY]

GO

INSERT INTO CFG_DAY_LIGHT_SAVINGS_TIME VALUES
('2001-04-01 02:00:00.000',   '2001-10-27 01:59:59.997',    2001),
('2002-04-07 02:00:00.000',   '2002-10-26 01:59:59.997',    2002),
('2003-04-06 02:00:00.000',   '2003-10-25 01:59:59.997',    2003),
('2004-04-04 02:00:00.000',   '2004-10-30 01:59:59.997',    2004),
('2005-04-03 02:00:00.000',   '2005-10-29 01:59:59.997',    2005),
('2006-04-02 02:00:00.000',   '2006-10-28 01:59:59.997',    2006),
('2007-03-11 02:00:00.000',   '2007-11-03 01:59:59.997',    2007),
('2008-03-09 02:00:00.000',   '2008-11-01 01:59:59.997',    2008),
('2009-03-08 02:00:00.000',   '2009-10-31 01:59:59.997',    2009),
('2010-03-14 02:00:00.000',   '2010-11-06 01:59:59.997',    2010),
('2011-03-13 02:00:00.000',   '2011-11-05 01:59:59.997',    2011),
('2012-03-11 02:00:00.000',   '2012-11-03 01:59:59.997',    2012),
('2013-03-10 02:00:00.000',   '2013-11-02 01:59:59.997',    2013),
('2014-03-09 02:00:00.000',   '2014-11-01 01:59:59.997',    2014),
('2015-03-08 02:00:00.000',   '2015-10-31 01:59:59.997',    2015),
('2016-03-13 02:00:00.000',   '2016-11-05 01:59:59.997',    2016),
('2017-03-12 02:00:00.000',   '2017-11-04 01:59:59.997',    2017),
('2018-03-11 02:00:00.000',   '2018-11-03 01:59:59.997',    2018),
('2019-03-10 02:00:00.000',   '2019-11-02 01:59:59.997',    2019),
('2020-03-08 02:00:00.000',   '2020-10-31 01:59:59.997',    2020),
('2021-03-14 02:00:00.000',   '2021-11-06 01:59:59.997',    2021),
('2022-03-13 02:00:00.000',   '2022-11-05 01:59:59.997',    2022),
('2023-03-12 02:00:00.000',   '2023-11-04 01:59:59.997',    2023),
('2024-03-10 02:00:00.000',   '2024-11-02 01:59:59.997',    2024),
('2025-03-09 02:00:00.000',   '2025-11-01 01:59:59.997',    2025),
('1967-04-30 02:00:00.000',   '1967-10-29 01:59:59.997',    1967),
('1968-04-28 02:00:00.000',   '1968-10-27 01:59:59.997',    1968),
('1969-04-27 02:00:00.000',   '1969-10-26 01:59:59.997',    1969),
('1970-04-26 02:00:00.000',   '1970-10-25 01:59:59.997',    1970),
('1971-04-25 02:00:00.000',   '1971-10-31 01:59:59.997',    1971),
('1972-04-30 02:00:00.000',   '1972-10-29 01:59:59.997',    1972),
('1973-04-29 02:00:00.000',   '1973-10-28 01:59:59.997',    1973),
('1974-01-06 02:00:00.000',   '1974-10-27 01:59:59.997',    1974),
('1975-02-23 02:00:00.000',   '1975-10-26 01:59:59.997',    1975),
('1976-04-25 02:00:00.000',   '1976-10-31 01:59:59.997',    1976),
('1977-04-24 02:00:00.000',   '1977-10-31 01:59:59.997',    1977),
('1978-04-30 02:00:00.000',   '1978-10-29 01:59:59.997',    1978),
('1979-04-29 02:00:00.000',   '1979-10-28 01:59:59.997',    1979),
('1980-04-27 02:00:00.000',   '1980-10-26 01:59:59.997',    1980),
('1981-04-26 02:00:00.000',   '1981-10-25 01:59:59.997',    1981),
('1982-04-25 02:00:00.000',   '1982-10-25 01:59:59.997',    1982),
('1983-04-24 02:00:00.000',   '1983-10-30 01:59:59.997',    1983),
('1984-04-29 02:00:00.000',   '1984-10-28 01:59:59.997',    1984),
('1985-04-28 02:00:00.000',   '1985-10-27 01:59:59.997',    1985),
('1986-04-27 02:00:00.000',   '1986-10-26 01:59:59.997',    1986),
('1987-04-05 02:00:00.000',   '1987-10-25 01:59:59.997',    1987),
('1988-04-03 02:00:00.000',   '1988-10-30 01:59:59.997',    1988),
('1989-04-02 02:00:00.000',   '1989-10-29 01:59:59.997',    1989),
('1990-04-01 02:00:00.000',   '1990-10-28 01:59:59.997',    1990),
('1991-04-07 02:00:00.000',   '1991-10-27 01:59:59.997',    1991),
('1992-04-05 02:00:00.000',   '1992-10-25 01:59:59.997',    1992),
('1993-04-04 02:00:00.000',   '1993-10-31 01:59:59.997',    1993),
('1994-04-03 02:00:00.000',   '1994-10-30 01:59:59.997',    1994),
('1995-04-02 02:00:00.000',   '1995-10-29 01:59:59.997',    1995),
('1996-04-07 02:00:00.000',   '1996-10-27 01:59:59.997',    1996),
('1997-04-06 02:00:00.000',   '1997-10-26 01:59:59.997',    1997),
('1998-04-05 02:00:00.000',   '1998-10-25 01:59:59.997',    1998),
('1999-04-04 02:00:00.000',   '1999-10-31 01:59:59.997',    1999),
('2000-04-02 02:00:00.000',   '2000-10-29 01:59:59.997',    2000)
GO

अब हम प्रत्येक अमेरिकी टाइमज़ोन के लिए एक फ़ंक्शन बनाते हैं। यह मान लिया गया है कि यूनिक्स का समय मिलीसेकंड में है। यदि यह सेकंड में है, तो कोड से / 1000 निकालें:

शांत

create function [dbo].[UnixTimeToPacific] 
 (@unixtime bigint)
   returns datetime
   as
   begin
     declare @pacificdatetime datetime
     declare @interimdatetime datetime = dateadd(s, @unixtime/1000, '1970-01-01')
     select  @pacificdatetime =  dateadd(hour,case when @interimdatetime between begin_date and end_date then -7 else -8 end  ,@interimdatetime)
     from cfg_day_light_savings_time  where  year_date = datepart(year,@interimdatetime)
     if @pacificdatetime is null 
       select @pacificdatetime= dateadd(hour, -7, @interimdatetime)
return @pacificdatetime    
end

पूर्व का

create function [dbo].[UnixTimeToEastern] 
 (@unixtime bigint)
   returns datetime
   as
   begin
     declare @easterndatetime datetime
     declare @interimdatetime datetime = dateadd(s, @unixtime/1000, '1970-01-01')
     select  @easterndatetime =  dateadd(hour,case when @interimdatetime between begin_date and end_date then -4 else -5 end  ,@interimdatetime)
     from cfg_day_light_savings_time  where  year_date = datepart(year,@interimdatetime)
     if @easterndatetime is null 
       select @easterndatetime= dateadd(hour, -4, @interimdatetime)
return @easterndatetime    
end

केंद्रीय

create function [dbo].[UnixTimeToCentral] 
 (@unixtime bigint)
   returns datetime
   as
   begin
     declare @centraldatetime datetime
     declare @interimdatetime datetime = dateadd(s, @unixtime/1000, '1970-01-01')
     select  @centraldatetime =  dateadd(hour,case when @interimdatetime between begin_date and end_date then -5 else -6 end  ,@interimdatetime)
     from cfg_day_light_savings_time  where  year_date = datepart(year,@interimdatetime)
     if @centraldatetime is null 
       select @centraldatetime= dateadd(hour, -5, @interimdatetime)
return @centraldatetime    
end

पर्वत

create function [dbo].[UnixTimeToMountain] 
 (@unixtime bigint)
   returns datetime
   as
   begin
     declare @mountaindatetime datetime
     declare @interimdatetime datetime = dateadd(s, @unixtime/1000, '1970-01-01')
     select  @mountaindatetime =  dateadd(hour,case when @interimdatetime between begin_date and end_date then -6 else -7 end  ,@interimdatetime)
     from cfg_day_light_savings_time  where  year_date = datepart(year,@interimdatetime)
     if @mountaindatetime is null 
       select @mountaindatetime= dateadd(hour, -6, @interimdatetime)
return @mountaindatetime    
end

हवाई

create function [dbo].[UnixTimeToHawaii] 
 (@unixtime bigint)
   returns datetime
   as
   begin
     declare @hawaiidatetime datetime
     declare @interimdatetime datetime = dateadd(s, @unixtime/1000, '1970-01-01')
     select  @hawaiidatetime =  dateadd(hour,-10,@interimdatetime)
     from cfg_day_light_savings_time  where  year_date = datepart(year,@interimdatetime)

return @hawaiidatetime    
end

एरिज़ोना

create function [dbo].[UnixTimeToArizona] 
 (@unixtime bigint)
   returns datetime
   as
   begin
     declare @arizonadatetime datetime
     declare @interimdatetime datetime = dateadd(s, @unixtime/1000, '1970-01-01')
     select  @arizonadatetime =  dateadd(hour,-7,@interimdatetime)
     from cfg_day_light_savings_time  where  year_date = datepart(year,@interimdatetime)

return @arizonadatetime    
end

अलास्का

create function [dbo].[UnixTimeToAlaska] 
 (@unixtime bigint)
   returns datetime
   as
   begin
     declare @alaskadatetime datetime
     declare @interimdatetime datetime = dateadd(s, @unixtime/1000, '1970-01-01')
     select  @alaskadatetime =  dateadd(hour,case when @interimdatetime between begin_date and end_date then -8 else -9 end  ,@interimdatetime)
     from cfg_day_light_savings_time  where  year_date = datepart(year,@interimdatetime)
     if @alaskadatetime is null 
       select @alaskadatetime= dateadd(hour, -8, @interimdatetime)
return @alaskadatetime    
end

1
//BIGINT UNIX TIMESTAMP CONVERSION upto Millisecond Accuracy
CREATE FUNCTION [dbo].[ConvertUnixTimestamp] (@Datetime [BIGINT]) RETURNS DATETIME
AS
BEGIN

    RETURN DATEADD(MILLISECOND, cast(@Datetime as bigint) % 1000, 
    DATEADD(SECOND, (cast(@Datetime as bigint) / 1000)%60, 
    DATEADD(MINUTE, ((cast(@Datetime as bigint) / 1000)/60)%60, 
    DATEADD(HOUR, ((cast(@Datetime as bigint) / 1000)/60)/60, '19700101'))))
END

1

मुझे भी इस समस्या का सामना करना पड़ा। दुर्भाग्य से, कोई भी उत्तर (यहां और अन्य दर्जनों पृष्ठों में) मेरे लिए संतोषजनक नहीं रहा है, क्योंकि मैं अभी भी 32 बिट पूर्णांक जातियों के कारण वर्ष 2038 से आगे की तारीखों तक नहीं पहुंच सकता।

एक समाधान जो अंत में मेरे लिए काम करता था float, वह चर का उपयोग करना था , इसलिए मैं कम से कम अधिकतम तारीख ले सकता था 2262-04-11T23:47:16.854775849। फिर भी, यह पूरे datetimeडोमेन को कवर नहीं करता है , लेकिन यह मेरी जरूरतों के लिए पर्याप्त है और दूसरों को भी इसी समस्या का सामना करने में मदद कर सकता है।

-- date variables
declare @ts bigint; -- 64 bit time stamp, 100ns precision
declare @d datetime2(7) = GETUTCDATE(); -- 'now'
-- select @d = '2262-04-11T23:47:16.854775849'; -- this would be the max date

-- constants:
declare @epoch datetime2(7) = cast('1970-01-01T00:00:00' as datetime2(7));
declare @epochdiff int = 25567; -- = days between 1900-01-01 and 1970-01-01
declare @ticksofday bigint = 864000000000; -- = (24*60*60*1000*1000*10)

-- helper variables:
declare @datepart float;
declare @timepart float;
declare @restored datetime2(7);

-- algorithm:
select @ts = DATEDIFF_BIG(NANOSECOND, @epoch, @d) / 100; -- 'now' in ticks according to unix epoch
select @timepart = (@ts % @ticksofday) / @ticksofday; -- extract time part and scale it to fractional part (i. e. 1 hour is 1/24th of a day)
select @datepart = (@ts - @timepart) / @ticksofday; -- extract date part and scale it to fractional part
select @restored = cast(@epochdiff + @datepart + @timepart as datetime); -- rebuild parts to a datetime value

-- query original datetime, intermediate timestamp and restored datetime for comparison
select
  @d original,
  @ts unix64,
  @restored restored
;

-- example result for max date:
-- +-----------------------------+-------------------+-----------------------------+
-- | original                    | unix64            | restored                    |
-- +-----------------------------+-------------------+-----------------------------+
-- | 2262-04-11 23:47:16.8547758 | 92233720368547758 | 2262-04-11 23:47:16.8533333 |
-- +-----------------------------+-------------------+-----------------------------+

विचार करने के लिए कुछ बिंदु हैं:

  • मेरे मामले में 100ns परिशुद्धता की आवश्यकता है, हालांकि यह 64 बिट यूनिक्स टाइमस्टैम्प के लिए मानक रिज़ॉल्यूशन प्रतीत होता है। यदि आप किसी अन्य रिज़ॉल्यूशन का उपयोग करते हैं, तो आपको समायोजित करना होगा@ticksofday अनुसार एल्गोरिथ्म की पहली पंक्ति ।
  • मैं अन्य प्रणालियों का उपयोग कर रहा हूं जिनमें समय क्षेत्र आदि के साथ उनकी समस्याएं हैं और मुझे लगता है कि मेरे लिए सबसे अच्छा समाधान हमेशा यूटीसी का उपयोग करना होगा। आपकी आवश्यकताओं के लिए, यह भिन्न हो सकता है।
  • 1900-01-01के लिए मूल तिथि है datetime2, जैसे 1970-01-01यूनिक्स टाइमस्टैम्प के लिए युग है ।
  • floats ने वर्ष -२०३ the-समस्या और पूर्णांक ओवरफ्लो को हल करने में मेरी मदद की और इस तरह, लेकिन यह ध्यान रखें कि फ्लोटिंग पॉइंट नंबर बहुत ज्यादा अच्छे नहीं हैं और बड़ी मात्रा में टाइमस्टैम्प के प्रसंस्करण को धीमा कर सकते हैं। इसके अलावा, राउंडऑफ़ त्रुटियों के कारण फ़्लोट सटीक का नुकसान हो सकता है, जैसा कि आप ऊपर की अधिकतम तिथि के लिए उदाहरण के परिणामों की तुलना में देख सकते हैं (यहां, त्रुटि लगभग 1.4425ms है)।
  • एल्गोरिथ्म की अंतिम पंक्ति में एक कास्ट है datetime। दुर्भाग्यवश, संख्यात्मक मानों से कोई स्पष्ट कास्ट datetime2की अनुमति नहीं है, लेकिन इसे संख्यात्मक रूप से स्पष्ट रूप से कास्ट करने की अनुमति है datetimeऔर यह बदले में, अनुमानित रूप से डाली जाती है datetime2। यह अब के लिए सही हो सकता है, लेकिन SQL सर्वर के भविष्य के संस्करणों में बदल सकता है: या तो कोई dateadd_big()फ़ंक्शन होगा या स्पष्ट कलाकारों को datetime2अनुमति दी जाएगी या स्पष्ट कलाकारों को datetimeअस्वीकृत किया जाएगा, इसलिए यह या तो टूट सकता है या हो सकता है किसी दिन आसान तरीका।

1

GMT के लिए, यहाँ सबसे आसान तरीका है:

Select dateadd(s, @UnixTime+DATEDIFF (S, GETUTCDATE(), GETDATE()), '1970-01-01')

0

बेहतर? यह फ़ंक्शन मिलीसेकंड में अनएक्सटाइम को डेटाटाइम में कनवर्ट करता है। यह मिलीसेकेंड खो गया है, लेकिन अभी भी छानने के लिए बहुत उपयोगी है।

CREATE FUNCTION [dbo].[UnixTimestampToGMTDatetime] 
(@UnixTimestamp bigint)
RETURNS datetime
AS
BEGIN
       DECLARE @GMTDatetime datetime
       select @GMTDatetime = 
       CASE
       WHEN dateadd(ss, @UnixTimestamp/1000, '1970-01-01') 
       BETWEEN 
           Convert(DATETIME, Convert(VARCHAR(4), Year(dateadd(ss, @UnixTimestamp/1000, '1970-01-01') )) + '-03-' + Convert(VARCHAR(2), (31 - (5 * Year(dateadd(ss, @UnixTimestamp/1000, '1970-01-01') )/4 + 4) % 7)) + ' 01:00:00', 20)
       AND
           Convert(DATETIME, Convert(VARCHAR(4), Year(dateadd(ss, @UnixTimestamp/1000, '1970-01-01') )) + '-10-' + Convert(VARCHAR(2), (31 - (5 * Year(dateadd(ss, @UnixTimestamp/1000, '1970-01-01') )/4 + 1) % 7)) + ' 02:00:00', 20)
       THEN Dateadd(hh, 1, dateadd(ss, @UnixTimestamp/1000, '1970-01-01'))
       ELSE Dateadd(hh, 0, dateadd(ss, @UnixTimestamp/1000, '1970-01-01'))
       END
RETURN @GMTDatetime    
END

0

समाधान निम्नलिखित हो सकते हैं:

DECLARE @UnixTimeStamp bigint = 1564646400000 /*2019-08-01 11:00 AM*/

DECLARE @LocalTimeOffset bigint = DATEDIFF(MILLISECOND, GETDATE(), GETUTCDATE());
DECLARE @AdjustedTimeStamp bigint = @UnixTimeStamp - @LocalTimeOffset;
SELECT [DateTime] = DATEADD(SECOND, @AdjustedTimeStamp % 1000, DATEADD(SECOND, @AdjustedTimeStamp / 1000, '19700101'));

0

@DanielLittle के पास विशिष्ट प्रश्न का सबसे आसान और सबसे सुंदर जवाब है। हालाँकि, यदि आप किसी विशिष्ट समयक्षेत्र में परिवर्तित होने में रुचि रखते हैं और डीएसटी (डेलाइट सेविंग टाइम) को ध्यान में रखते हैं, तो निम्नलिखित कार्य निम्नलिखित हैं:

CAST(DATEADD(S, [UnixTimestamp], '1970-01-01') AT TIME ZONE 'UTC' AT TIME ZONE 'Pacific Standard Time' AS Datetime)

नोट: यह समाधान केवल SQL Server 2016 और इसके बाद के संस्करण (और Azure) पर काम करता है।

एक समारोह बनाने के लिए:

CREATE FUNCTION dbo.ConvertUnixTime (@input INT)
RETURNS Datetime
AS BEGIN
    DECLARE @Unix Datetime

    SET @Unix = CAST(DATEADD(S, @Input, '1970-01-01') AT TIME ZONE 'UTC' AT TIME ZONE 'Pacific Standard Time' AS Datetime)

    RETURN @Unix
END

आप फ़ंक्शन को इस तरह से कॉल कर सकते हैं:

SELECT   dbo.ConvertUnixTime([UnixTimestamp])
FROM     YourTable
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.