回答
试试这个职位: 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
或这个帖子:
代码如下:
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
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
我经常需要一个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年翻身。)
对于“ - 正确的方式,对于SQL Server 2008和更大“我必须乘以1000的结果去除它创建的小数点。之后获得毫秒epoc。奇迹般有效。谢谢!! – jymbo 2017-06-24 14:27:03
如果你不是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)
当调用标量值函数可以使用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());
- 1. Mysql的UNIX_TIMESTAMP函数
- 2. 从UNIX_TIMESTAMP
- 3. 问题从SQL查询转换UNIX_TIMESTAMP成日期在java中
- 4. 在Hive中获取当前的unix_timestamp
- 5. 在SQL Server中
- 6. UNIX_TIMESTAMP()函数中阶火花
- 7. 问题与unix_timestamp
- 8. UNIX_TIMESTAMP函数MySQL
- 9. PDO-在数据库中插入UNIX_TIMESTAMP
- 10. SQL在SQL Server Management Studio中
- 11. 在SQL Server 2000中
- 12. 在SQL Server中第
- 13. 在SQL Server 2005中
- 14. SmallDateTime在SQL Server中
- 15. 在sql server中的身份?
- 16. MySQL的LIMIT在SQL Server中
- 17. 在SQL Server中的Int 10
- 18. 列在sql server中的行?
- 19. 在sql server中的性能?
- 20. 在SQL Server中的钱
- 21. SQL Server中的XML存在()
- 22. 使用UNIX_TIMESTAMP确定
- 23. UNIX_TIMESTAMP使用查询
- 24. 适用于PostgreSQL的MySQL UNIX_TIMESTAMP
- 25. 在sql server 2008中的SQL FIFO逻辑
- 26. REGEXP_LIKE在SQL Server T-SQL中的转换
- 27. 跟踪XML节点在SQL Server中的SQL Server这样的流
- 28. UNIX_TIMESTAMP不正确的结果
- 29. SQL Server - 在SQL Server中执行数据类型的过程
- 30. 在与SQL Server 2000兼容的SQL Server 2008中创建脚本
我试过第一个。执行“SELECT UNIX_TIMESTAMP(GETDATE());”返回“'UNIX_TIMESTAMP'不是公认的内置函数名称。”试图运行(再次)设置查询返回“消息2714,级别16,状态3,过程UNIX_TIMESTAMP,行12 数据库中已有一个名为'UNIX_TIMESTAMP'的对象。” – TheZver 2012-01-12 15:13:30
你试过SELECT dbo.UNIX_TIMESTAMP(GETDATE()); ? – rkosegi 2012-01-12 15:14:28
第二次正常工作。但试图命名它就像'UNIX_TIMESTAMP'产生如前所述的相同结果。没有办法将其命名为'UNIX_TIMESTAMP'?我试图避免修改很多代码,需要使用mysql和mssql – TheZver 2012-01-12 15:19:41