2012-01-12 32 views

Respuesta

14

Prueba este mensaje: 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 

o este post:

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

código es el siguiente: el uso

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 

muestra:

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

He intentado con el primero. ejecutando "SELECT UNIX_TIMESTAMP (GETDATE());" devuelve "'UNIX_TIMESTAMP' no es un nombre de función incorporado reconocido.". tratando de ejecutar (nuevamente) la consulta de configuración devuelve "Msg 2714, nivel 16, estado 3, procedimiento UNIX_TIMESTAMP, línea 12 Ya hay un objeto llamado 'UNIX_TIMESTAMP' en la base de datos." – TheZver

+1

¿Has intentado SELECCIONAR dbo.UNIX_TIMESTAMP (GETDATE()); ? – rkosegi

+0

el segundo funcionó bien. pero tratar de nombrarlo como 'UNIX_TIMESTAMP' produjo los mismos resultados que se describieron anteriormente. ¿No hay una forma de que se llame 'UNIX_TIMESTAMP'? Estoy tratando de evitar la modificación de casi el código, que debe funcionar con mysql Y mssql – TheZver

0

Necromancing.
El ODBC vías:

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

que a menudo necesitan una marca de tiempo UNIX con una precisión de milisegundos. Lo siguiente le dará el tiempo unixtime actual como FLOAT; envuélvalo por las respuestas anteriores para obtener una función o convertir cadenas arbitrarias.

El tipo de datos DATETIME en SQL Server solo es bueno para 3 mseg, así que tengo diferentes ejemplos para SQL Server 2005 y 2008+. Lamentablemente no existe la función DATEDIFF2, por lo que se requieren varios trucos para evitar el desbordamiento de entero DATEDIFF incluso con 2008+. (No puedo creer que introdujeron un nuevo tipo de datos DATETIME2 sin arreglar esto.)

Para regular de edad DATETIME, sólo tiene que utilizar un yeso de mala calidad a flotar, que devuelve (coma flotante) número de días desde 1900.

Ahora sé que en este punto, usted está pensando ¿QUÉ ACERCA DE LEAP SECONDS?!?! Ni el tiempo de Windows ni el tiempo real realmente creen en segundos intercalares: un día es siempre de 1,00000 días para SQL Server y de 86400 segundos para unixtime. This wikipedia article explica cómo se comporta unixtime durante los segundos intercalares; Creo que Windows solo visualiza segundos increíbles como cualquier otro error de reloj. Entonces, si bien no existe una deriva sistemática entre los dos sistemas cuando ocurre un segundo intercalar, no se pondrán de acuerdo en el nivel de segundo nivel durante e inmediatamente después de un segundo intercalar.

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

Los FLOAT realidad por defecto a 8 bytes se duplica en SQL Server, y por lo tanto superior a 32 bits INT para muchos casos de uso. (Por ejemplo, no se darán la vuelta en 2038).)

+0

For "- de la manera correcta, para sql server 2008 y mayor "Tuve que multiplicar el resultado por 1000 para eliminar los puntos decimales que estaba creando.Obtenga la epoc de milisegundos después de eso. Funciona de maravilla. ¡¡Gracias!! – jymbo

19

Si no está preocupado acerca de las fechas antes de 1970, o la precisión de milisegundos, acaba de hacer:

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

Casi tan simple como función integrada de MySQL:

-- MySQL 
SELECT UNIX_TIMESTAMP(DateField); 

Otros idiomas (Oracle, PostgreSQL, etc): How To Get The Current Epoch Time (Unix Timestamp)

0

Cuando se llama a las funciones con valores escalares pueden utilizar follwing sintaxis

Guión

Función:

USO [Base de datos] GO

/****** Objeto:. UserDefinedFunction [dbo] [UNIX_TIMESTAMP] ******/ ANSI_NULLS EN GO

QUOTED_IDENTIFIER

SET EN GO

función Crear [dbo]. [UNIX_TIMESTAMP] ( @ctimestamp datetime ) RETURNS integer AS COMENZAR /* cuerpo de la función */ declare número entero @return

SELECT @return = DATEDIFF (SEGUNDO, {d '1970-01-01'}, @ctimestamp)

retorno @return FIN IR

llamada Función: SELECT dbo.UNIX_TIMESTAMP (GETDATE());