2010-09-06 18 views
9

per favore aiutatemi con questo, voglio convertire un valore da Bigint a datetime. Per esempio im lettura STORIA tabella di server di TeamCity, sul campo build_start_time_server ho questo valore su un record 1283174502729.Conversione da Bigint a valore datetime

come posso convertire in valore datetime ???

Grazie

+0

Ho modificato i tag per renderli più specifici. Nota che se usi "sql server" nel campo tag questo andrà sotto il tag * sql * così come il tag * server * ma non sotto il tag * sql-server * che è probabilmente quello che vuoi. – krock

+1

Quale valore data/ora si desidera per 1283174502729? – gbn

risposta

22

Questo funziona per voi? Esso restituisce 30-8-2010 13:21:42 al momento su SQL Server 2005:

select dateadd(s, convert(bigint, 1283174502729)/1000, convert(datetime, '1-1-1970 00:00:00')) 

Ho diviso per 1000 perché la funzione DateAdd non funziona con un numero che di grandi dimensioni. Quindi perdi un po 'di precisione, ma è molto più semplice da usare.

+1

Krock, questo è perfetto. Grazie per il tuo aiuto. – Chris

+0

@Chris se questo è corretto, si dovrebbe accettare la risposta. –

2

approccio leggermente diverso:

lo scenario:

SELECT dateadd(ms, 1283174502729/86400000, (1283174502729/86400000) + 25567) 
FROM yourtable 

Codice generico:

SELECT dateadd(ms, yourfield/86400000, (yourfield/86400000) + 25567) 
FROM yourtable 

uscita:

August, 30 2010 00:00:14 

SQL Fiddle: http://sqlfiddle.com/#!3/c9eb5a/2/0

2
CAST(SWITCHOFFSET(CAST(dateadd(s, convert(bigint, [t_stamp])/1000, convert(datetime, '1-1-1970 00:00:00')) AS DATETIMEOFFSET), DATENAME (TZoffset, SYSDATETIMEOFFSET())) AS DATETIME) 
+0

Ancora non capisco il voto basso. Ci sono errori? Funziona per 2008R2. È inefficiente? Come posso migliorare se non so cosa migliorare. – stinkyjak

+0

Immagino che il downvote fosse per fornire una risposta solo al codice senza alcuna spiegazione su cosa sta facendo o perché funziona. – iamdave

0

DATEADD (seconda, yourvalue, CAST ('1970-01-01 00:00:00' AS datetime))

+0

Downvoted. "Errore di overflow aritmetico che converte espressione in tipo di dati int" con i dati forniti nella domanda. – UnhandledExcepSean

+0

Tuttavia con un po 'di modifiche potrebbe funzionare, forse il poster può funzionare un po'?(svalutato per incoraggiarlo un po ':)) – Gar

0

Il seguente prende nuova terminologia SQL conto e restituirà i millisecondi (can anche essere modificati per essere utilizzati in un campo calcolato.) [SQL Server 2012 o versioni successive]

declare @StartDate datetime2(3) = '1970-01-01 00:00:00.000' 
, @milliseconds bigint = 1283174502729 
, @MillisecondsPerDay int = 60 * 60 * 24 * 1000 -- = 86400000 

SELECT DATEADD(MILLISECOND, TRY_CAST(@milliseconds % @millisecondsPerDay AS 
INT), DATEADD(DAY, TRY_CAST(@milliseconds/@millisecondsPerDay AS INT), 
@StartDate)); 
Problemi correlati