2012-01-12 43 views

Trả lời

14

Hãy thử bài này: 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 

hoặc bài đăng này:

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

mã như sau: sử dụng

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 

mẫu:

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

tôi đã thử phiên bản đầu tiên. thực thi "SELECT UNIX_TIMESTAMP (GETDATE());" trả về "'UNIX_TIMESTAMP' không phải là tên hàm được xây dựng sẵn." cố gắng chạy (một lần nữa) truy vấn thiết lập trả về "Msg 2714, Cấp 16, Tiểu bang 3, Thủ tục UNIX_TIMESTAMP, Dòng 12 Đã có một đối tượng có tên 'UNIX_TIMESTAMP' trong cơ sở dữ liệu." – TheZver

+1

Bạn đã thử SELECT dbo.UNIX_TIMESTAMP (GETDATE()); ? – rkosegi

+0

lần thứ hai hoạt động tốt. nhưng cố gắng đặt tên nó giống như 'UNIX_TIMESTAMP' đã tạo ra kết quả tương tự như được mô tả trước đây. không có cách nào để đặt tên là 'UNIX_TIMESTAMP'? Tôi đang cố gắng để tránh sửa đổi khá nhiều mã, mà cần phải làm việc với mysql và mssql – TheZver

0

Necromancing.
ODBC chiều:

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

Tôi thường cần một dấu thời gian với độ chính xác millisecond unix. Sau đây sẽ cung cấp cho bạn thời gian hiện tại là FLOAT; bọc mỗi câu trả lời ở trên để nhận hàm hoặc chuyển đổi chuỗi tùy ý.

Kiểu dữ liệu DATETIME trên SQL Server chỉ tốt cho 3 msec, vì vậy tôi có các ví dụ khác nhau cho SQL Server 2005 và 2008+. Đáng buồn là không có hàm DATEDIFF2, vì vậy cần có nhiều thủ thuật khác nhau để tránh DATEDIFF tràn số nguyên ngay cả với năm 2008 trở lên. (Tôi chưa thể tin rằng họ đã giới thiệu một hoàn toàn mới DATETIME2 datatype mà không sửa chữa này.)

Đối với bình thường cũ DATETIME, tôi chỉ sử dụng một dàn diễn viên nhếch nhác làm nổi, trong đó trả về (floating point) số ngày kể từ 1900.

Bây giờ tôi biết tại thời điểm này, bạn đang suy nghĩ NHỮNG GÌ VỀ KHOẢNG TIẾP CẬN?!?! Không có thời gian Windows cũng như unixtime thực sự tin vào giây nhuận: một ngày luôn luôn là 1.00000 ngày để SQL Server, và 86400 giây dài để unixtime. This wikipedia article thảo luận về cách hoạt động của Unix trong giây nhảy vọt; Windows tôi tin rằng chỉ cần xem giây nhuận như bất kỳ lỗi đồng hồ nào khác. Vì vậy, trong khi không có hệ thống trôi dạt giữa hai hệ thống khi một bước nhảy vọt thứ hai xảy ra, họ sẽ không đồng ý ở cấp độ phụ thứ hai trong và ngay lập tức sau một bước nhảy vọt thứ hai.

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

nổi thực sự mặc định 8-byte đôi trên SQL Server, và do đó vượt trội so với 32-bit INT cho nhiều trường hợp sử dụng. (Ví dụ, họ sẽ không chuyển sang năm 2038.)

+0

Đối với "- đúng cách, cho máy chủ sql 2008 và lớn hơn "Tôi phải nhân kết quả bằng 1000 để loại bỏ các dấu thập phân mà nó tạo ra.Lấy phần nghìn giây sau đó. Làm việc như một say mê. Cảm ơn!! – jymbo

19

Nếu bạn không bận tâm về những ngày trước năm 1970, hoặc phần nghìn giây chính xác, chỉ cần làm:

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

Hầu như đơn giản như tích hợp chức năng của MySQL:

-- MySQL 
SELECT UNIX_TIMESTAMP(DateField); 

ngôn ngữ khác (Oracle, PostgreSQL, v.v.): How To Get The Current Epoch Time (Unix Timestamp)

0

Khi được gọi đến hàm vô hướng có thể sử dụng cú pháp follwing

Chức năng Script:

SỬ DỤNG [Cơ sở dữ liệu] GO

/****** Object:. UserDefinedFunction [dbo] [UNIX_TIMESTAMP] ******/ ANSI_NULLS SET ON GO

SET QUOTED_IDENTIFIER ON GO

CREATE FUNCTION [dbo]. [UNIX_TIMESTAMP] ( @ctimestamp datetime ) RETURNS số nguyên AS BEGIN /* Chức năng cơ thể */ khai báo @return nguyên

CHỌN @return = DATEDIFF (THỨ HAI, {d '1970/01/01'}, @ctimestamp)

trở @return END GO

Chức năng gọi: CHỌN dbo.UNIX_TIMESTAMP (GETDATE());