복붙노트

[SQL] SQL Server의 UNIX_TIMESTAMP

SQL

SQL Server의 UNIX_TIMESTAMP

나는 SQL Server의 함수를 만들 수 2,008 의지 모방의 MySQL의 UNIX_TIMESTAMP 그 ()가 필요합니다.

사전에 감사합니다!

해결법

  1. ==============================

    1.이 게시물을 시도해보십시오 https://web.archive.org/web/20141216081938/http://skinn3r.wordpress.com/2009/01/26/t-sql-datetime-to-unix-timestamp/

    이 게시물을 시도해보십시오 https://web.archive.org/web/20141216081938/http://skinn3r.wordpress.com/2009/01/26/t-sql-datetime-to-unix-timestamp/

    CREATE FUNCTION UNIX_TIMESTAMP (
    @ctimestamp datetime
    )
    RETURNS integer
    AS 
    BEGIN
      /* Function body */
      declare @return integer
    
      SELECT @return = DATEDIFF(SECOND,{d '1970-01-01'}, @ctimestamp)
    
      return @return
    END
    

    또는이 게시물 :

    http://mysql.databases.aspfaq.com/how-do-i-convert-a-sql-server-datetime-value-to-a-unix-timestamp.html

    다음과 같이 코드는 다음과 같습니다

    CREATE FUNCTION dbo.DTtoUnixTS 
    ( 
        @dt DATETIME 
    ) 
    RETURNS BIGINT 
    AS 
    BEGIN 
        DECLARE @diff BIGINT 
        IF @dt >= '20380119' 
        BEGIN 
            SET @diff = CONVERT(BIGINT, DATEDIFF(S, '19700101', '20380119')) 
                + CONVERT(BIGINT, DATEDIFF(S, '20380119', @dt)) 
        END 
        ELSE 
            SET @diff = DATEDIFF(S, '19700101', @dt) 
        RETURN @diff 
    END
    

    샘플 사용 :

    SELECT dbo.DTtoUnixTS(GETDATE()) 
    -- or 
    SELECT UnixTimestamp = dbo.DTtoUnixTS(someColumn) 
        FROM someTable
    
  2. ==============================

    2.당신이 1970 년 또는 밀리 초 정밀 전에 날짜에 대해 방해하지 않는 경우, 바로 수행

    당신이 1970 년 또는 밀리 초 정밀 전에 날짜에 대해 방해하지 않는 경우, 바로 수행

    -- SQL Server
    SELECT DATEDIFF(s, '1970-01-01 00:00:00', DateField)
    

    대부분의 MySQL의 간단 같은 내장 기능 :

    -- MySQL
    SELECT UNIX_TIMESTAMP(DateField);
    

    다른 언어 (오라클, PostgreSQL을, 등)의 현재 시대의 시간을 얻을하는 방법 ...

  3. ==============================

    3.SQL 서버 2016 이후는 밀리 초를 얻을하는 데 사용할 수있는 DATEDIFF_BIG 기능을 가지고있다.

    SQL 서버 2016 이후는 밀리 초를 얻을하는 데 사용할 수있는 DATEDIFF_BIG 기능을 가지고있다.

    SELECT DATEDIFF_BIG(millisecond, '1970-01-01 00:00:00', GETUTCDATE())
    

    함수 만들기

    CREATE FUNCTION UNIX_TIMESTAMP()
        RETURNS BIGINT
    AS
    BEGIN
        RETURN DATEDIFF_BIG(millisecond, '1970-01-01 00:00:00', GETUTCDATE())
    END
    

    그리고 그것을 실행

    SELECT dbo.UNIX_TIMESTAMP()
    
  4. ==============================

    4.나는 종종 밀리 초 정밀도로 유닉스 타임 스탬프가 필요합니다. 다음은 당신에게 FLOAT로 현재 unixtime을 줄 것이다; 함수를 얻거나 임의의 문자열을 변환하는 위의 답변에 따라 포장.

    나는 종종 밀리 초 정밀도로 유닉스 타임 스탬프가 필요합니다. 다음은 당신에게 FLOAT로 현재 unixtime을 줄 것이다; 함수를 얻거나 임의의 문자열을 변환하는 위의 답변에 따라 포장.

    나는 SQL Server 2005 및 2008+ 다른 예를 그래서 SQL Server에서 DATETIME 데이터 타입은 3 밀리 초 만 좋다. 다양한 트릭이 DATEDIFF 정수 오버 플로우도 2008+에 방지하기 위해 필요한, 그래서 슬프게도, 더 DATEDIFF2 기능이 없습니다. (나는 그들이이 문제를 해결하지 않고 완전히 새로운 DATETIME2 데이터 형식을 도입 믿을 수 없어.)

    일반 오래된 DATETIME를 들어, 난 그냥 1900 이후의 일 플로트에 천박한 캐스트, 반환 (부동 소수점) 번호를 사용합니다.

    지금이 시점에서 알고, 당신은 무엇 윤초 대한 생각?!?! unixtime 윈도우 시간도 나도 정말 윤초 믿는 : 하루 SQL 서버에 1.00000 일 긴 항상, 86400 초 동안 unixtime합니다. unixtime는 윤초시의 작동 방식이 위키 피 디아 문서에 나와; 윈도우 난 그냥 다른 클럭 오류와 같은 윤초를 볼 생각합니다. 윤초가 발생할 때 두 시스템 사이에 체계적인 드리프트가없는 동안 그래서, 그들은 중 하위 두 번째 레벨에 동의하지 않으며 즉시 윤초를 다음과 같습니다.

    -- the right way, for sql server 2008 and greater
    declare @unixepoch2 datetime2;
    declare @now2 Datetime2;
    declare @days int;
    declare @millisec int;
    declare @today datetime2;
    set @unixepoch2 = '1970-01-01 00:00:00.0000';
    set @now2 = SYSUTCDATETIME();
    set @days = DATEDIFF(DAY,@unixepoch2,@now2);
    set @today = DATEADD(DAY,@days,@unixepoch2);
    set @millisec = DATEDIFF(MILLISECOND,@today,@now2);
    select (CAST (@days as float) * 86400) + (CAST(@millisec as float ) / 1000)
      as UnixTimeFloatSQL2008
    
    -- Note datetimes are only accurate to 3 msec, so this is less precise 
    -- than above, but works on any edition of SQL Server.
    declare @sqlepoch datetime;
    declare @unixepoch datetime;
    declare @offset float;
    set @sqlepoch = '1900-01-01 00:00:00';
    set @unixepoch = '1970-01-01 00:00:00';
    set @offset = cast (@sqlepoch as float) - cast (@unixepoch as float);
    select ( cast (GetUTCDate() as float) + @offset) * 86400 
      as UnixTimeFloatSQL2005;
    
    -- Future developers may hate you, but you can put the offset in
    -- as a const because it isn't going to change. 
    declare @sql_to_unix_epoch_in_days float;
    set @sql_to_unix_epoch_in_days = 25567.0;
    select ( cast (GetUTCDate() as float) - @sql_to_unix_epoch_in_days) * 86400.0 
      as UnixTimeFloatSQL2005MagicNumber;
    

    수레 실제로 SQL Server에서 8 바이트 더블 기본값으로, 많은 사용 사례에 대한 32 비트 INT에 따라서 우수한. (예를 들면, 그들은 2038 년 이월되지 않습니다)

  5. ==============================

    5.Necromancing. 는 ODBC-방법 :

    Necromancing. 는 ODBC-방법 :

    DECLARE @unix_timestamp varchar(20)
    -- SET @unix_timestamp = CAST({fn timestampdiff(SQL_TSI_SECOND,{d '1970-01-01'}, CURRENT_TIMESTAMP)} AS varchar(20)) 
    
    IF CURRENT_TIMESTAMP >= '20380119' 
    BEGIN 
        SET @unix_timestamp = CAST
        (
            CAST
            (
                {fn timestampdiff(SQL_TSI_SECOND,{d '1970-01-01'}, {d '2038-01-19'})} 
                AS bigint
            )  
            + 
            CAST
            (
                {fn timestampdiff(SQL_TSI_SECOND,{d '2038-01-19'}, CURRENT_TIMESTAMP)}
                AS bigint
            ) 
        AS varchar(20)
        ) 
    END 
    ELSE 
        SET @unix_timestamp = CAST({fn timestampdiff(SQL_TSI_SECOND,{d '1970-01-01'}, CURRENT_TIMESTAMP)} AS varchar(20))
    
    PRINT @unix_timestamp
    
  6. ==============================

    6.다음 구문을 사용할 수 있습니다 스칼라 반환 함수를 호출 할 때

    다음 구문을 사용할 수 있습니다 스칼라 반환 함수를 호출 할 때

    스크립트 기능 :

    USE [Database]
    GO
    
    /****** Object:  UserDefinedFunction [dbo].[UNIX_TIMESTAMP]  ******/
    SET ANSI_NULLS ON
    GO
    
    SET QUOTED_IDENTIFIER ON
    GO
    
    CREATE FUNCTION [dbo].[UNIX_TIMESTAMP] (
    @ctimestamp datetime
    )
    RETURNS integer
    AS
    BEGIN
      /* Function body */
      declare @return integer
    
      SELECT @return = DATEDIFF(SECOND,{d '1970-01-01'}, @ctimestamp)
    
      return @return
    END 
    GO
    

    전화 기능 :

    SELECT dbo.UNIX_TIMESTAMP(GETDATE());
    
  7. from https://stackoverflow.com/questions/8837225/unix-timestamp-in-sql-server by cc-by-sa and MIT license