2012-01-12 87 views

回答

14

試試這個職位: 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 
+0

我試過第一個。執行「SELECT UNIX_TIMESTAMP(GETDATE());」返回「'UNIX_TIMESTAMP'不是公認的內置函數名稱。」試圖運行(再次)設置查詢返回「消息2714,級別16,狀態3,過程UNIX_TIMESTAMP,行12 數據庫中已有一個名爲'UNIX_TIMESTAMP'的對象。」 – TheZver 2012-01-12 15:13:30

+1

你試過SELECT dbo.UNIX_TIMESTAMP(GETDATE()); ? – rkosegi 2012-01-12 15:14:28

+0

第二次正常工作。但試圖命名它就像'UNIX_TIMESTAMP'產生如前所述的相同結果。沒有辦法將其命名爲'UNIX_TIMESTAMP'?我試圖避免修改很多代碼,需要使用mysql和mssql – TheZver 2012-01-12 15:19:41

0

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 
2

我經常需要一個UNIX時間戳精確到毫秒。以下將給你當前的unixtime爲FLOAT;按上面的答案進行包裝以獲取函數或轉換任意字符串。

SQL Server上的DATETIME數據類型只有3毫秒,所以我對SQL Server 2005和2008+有不同的例子。可悲的是沒有DATEDIFF2函數,所以需要各種技巧來避免DATEDIFF整數溢出,即使使用2008+。 (我不能相信,他們推出了一個全新的DATETIME2數據類型不解決這個。)

對於普通的舊DATETIME,我只是用一種低俗的投浮動,返回天數(浮點)數自1900年以來

現在我知道在這一點上,你在想什麼LEAP SECONDS?!?! Windows時間和unixtime都不相信閏秒:一天對於SQL Server總是1.00000天,對於unixtime總是86400秒。 This wikipedia article討論unixtime在閏秒期間的行爲方式; Windows我相信只是像任何其他時鐘錯誤一樣查看閏秒。因此,當閏秒發生時,兩個系統之間沒有系統性的漂移,但在閏秒期間和緊接着閏秒之後,它們不會在亞秒級達成一致。

-- 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; 

FLOAT數據實際上默認爲8字節的SQL Server上一倍,因此優於32位INT對於很多使用情況。 (例如,他們不會在2038年翻身。)

+0

對於「 - 正確的方式,對於SQL Server 2008和更大「我必須乘以1000的結果去除它創建的小數點。之後獲得毫秒epoc。奇蹟般有效。謝謝!! – jymbo 2017-06-24 14:27:03

19

如果你不是1970年,或精確到毫秒之前困擾有關日期,只是做:

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

幾乎一樣簡單MySQL的內置功能:

-- MySQL 
SELECT UNIX_TIMESTAMP(DateField); 

其他語言(甲骨文,PostgreSQL的,等等):How To Get The Current Epoch Time (Unix Timestamp)

0

當調用標量值函數可以使用follwing語法

功能腳本:

USE [數據庫] GO

/******對象:UserDefinedFunction [DBO] [UNIX_TIMESTAMP] ******/ SET ANSI_NULLS ON GO

SET QUOTED_IDENTIFIER ON GO

CREATE FUNCTION [DBO]。[UNIX_TIMESTAMP]( @ctimestamp日期時間 ) RETURNS整數 AS BEGIN /*函數體*/ DECLARE @返回整數

SELECT @返回= DATEDIFF(SECOND,{d '1970-01-01'},@ctimestamp)

返回@return END GO

呼叫功能: SELECT dbo.UNIX_TIMESTAMP(GETDATE());