C’è un modo per ottenere il valore DateTime dalla colonna di tipo timestamp?

Ho bisogno di una selezione dalla tabella che non hanno la colonna che indica quando la riga è stata inserita, solo timestamp colonna (valori come: 0x0000000000530278). Alcuni dati sono stati importati a tavola ieri e ora ho bisogno di capire esattamente cosa è stato importato 🙁

C’è un modo per farlo utilizzando solo timestamp info? Qui Ho trovato che:

  • Timestamp è un 8 byte sequenziale numero Esadecimale, che non ha nulla a che fare con la data né il tempo.
  • Per ottenere il valore corrente di timestamp, utilizzare: @@DBTS.

Forse c’è un modo per trovare ciò che era timestamp valore determinato periodo di tempo? Che contribuirebbe a formare una select. O forse c’è una soluzione?

InformationsquelleAutor Dandikas | 2008-10-07



8 Replies
  1. 20

    L’istruzione Transact-SQL tipo di dati timestamp è un tipo di dati binari senza tempo-valori correlati.

    Quindi, per rispondere alla tua domanda: c’È un modo per ottenere il valore DateTime dalla colonna di tipo timestamp?

    La risposta è: Non

  2. 9

    Marca temporale, il tipo di dati in SQL Server 2005 è sinonimo di rowversion ed è solo un numero che viene incrementato automaticamente con ogni aggiornamento di riga.

    È possibile eseguire il cast di bigint per vedere il suo valore.

    Per ottenere quello che vuoi per nuove o aggiornate le righe, si dovrebbe probabilmente aggiungere un’altra colonna datetime (lastupdate) e un trigger per aggiornare la colonna con ogni aggiornamento.

    Per le righe che sono già stati inseriti, in passato, non credo che si può fare qualcosa per trovare l’esatta tempo.

    • Che spiega colonna timestamp tipo, ma non risponde alla mia domanda 😐
  3. 4

    Ho paura che non è possibile convertire/cast un TIMESTAMP per un valore di tipo DATETIME.
    Sono completamente diversi gli usi e le implementazioni che sono incompatibili.

    Vedere questo link
    http://www.sqlteam.com/article/timestamps-vs-datetime-data-types

    Libri on-line dice anche http://msdn.microsoft.com/en-us/library/aa260631.aspx

    SQL Server tipo di dati timestamp ha
    nulla a che fare con i tempi e le date. SQL
    Server timestamp sono i numeri binari
    che indicano la sequenza relativa
    che modifiche dei dati ha avuto luogo in
    un database. Il tipo di dati timestamp
    è stato originariamente realizzato per sostenere l’
    SQL Server algoritmi di recupero.

    • Forse c’è un modo per trovare ciò che era timestamp valore determinato periodo di tempo? Importazione posteriore della cosa, così intervallo di tempo è notevole (la precisione non è necessaria)
  4. 3

    Un’altra risposta a domanda:

    Se la colonna timestamp è l’unica risorsa per il recupero (senza backup, ecc) si può provare a utilizzare la seguente logica

    Timestamp è semplicemente un valore di un contatore che viene incrementato per ogni operazione di inserimento o aggiornamento, che viene eseguita su una tabella contenente una colonna di tipo timestamp.

    Se l’importazione dei dati che è successo ieri è stato uno di inserire dei vari documenti è possibile vedere una sequenza di numeri nella colonna di tipo timestamp come e.g:

    0x00000000000007D1
    0x00000000000007D2
    0x00000000000007D3
    0x00000000000007D4
    0x00000000000007D5

    L’ultima sequenza può essere la vostra aggiunta di dati (ovviamente non è garantito)
    Voi potrete combinare la conoscenza con altre cose (come l’auto-incremento colonna, se li si usa per identificare il record che ti interessano.

  5. 1

    Altre persone correttamente rilevato che il timestamp è un contatore binario.
    Tuttavia, se in una tabella del database, è avere il timestamp e il datetime quando è stato registrato, è possibile utilizzare tale informazione per andare da qualsiasi timestamp per un intervallo di date.
    Una tabella di log è un buon candidato per questo scopo. Supponendo che il tuo importazione tabella “fatture”, si potrebbe utilizzare una query come la seguente:

    WITH TS 
    AS
    (
    SELECT 
        L1.LastDateUpdated, COALESCE(L2.LastDateUpdated, {TS '2099-12-31 00:00:00'}) as LastDateUpdatedTo,
        L1.[TIMESTAMP], L2.[TIMESTAMP] as [TIMESTAMPTo]
    FROM 
    (
        SELECT L1.[LastDateUpdated]
              ,L1.[TIMESTAMP]
              ,ROW_NUMBER() OVER (ORDER BY L1.[LastDateUpdated]) ID
        FROM [Log] L1
    ) L1
    left join 
    (
        SELECT L2.[LastDateUpdated]
              ,L2.[TIMESTAMP]
              ,ROW_NUMBER() OVER (ORDER BY L2.[LastDateUpdated]) ID
        FROM [Log] L2
    ) L2 
        ON L1.ID = L2.ID - 1
    )
    SELECT TS.LastDateUpdated, TS.LastDateUpdatedTo, * from [Invoices]
        inner join TS ON [Invoices].Timestamp between TS.Timestamp and 
    TS.TIMESTAMPTo
    ORDER BY TS.TIMESTAMPTo DESC
  6. 0

    Penso che la vostra scommessa migliore è quello di ripristinare un backup prima di inserti e confrontare i backuped tabella con la tabella corrente.

  7. 0

    Per identificare nuove righe da timestamp è necessario tenere traccia dei timestamp che c’erano prima. In un pizzico, è possibile:

    • Ripristinare una versione precedente da qualche altra parte.
    • Copiare i dati da entrambe le tabelle in database di lavoro.
    • Identificare i dati inseriti dai timestamp presenti in uno ma non l’altro.

    Con un minor rischio di falsi positivi, se qualsiasi altra cosa sta succedendo nel DB in questo modo è una discreta differenza.

    Per una più robusta di controllo si potrebbe calcolare l’MD5 o SHA-1 hash con Hashbytes sulla riga contenuti per dare una differenza con una probabilità molto bassa di collisione (vedi questo articolo di wikipedia su Compleanno attacchi per una discussione di questo problema).

  8. 0

    So che è troppo tardi, ma potrebbe essere di aiuto a qualcun altro.

    Timestamp/RowVersion possono essere trasformati in BigInt ma significa che non può essere paragonato a datetime.

    Istruzione che segue è preso da MSDN

    L’istruzione Transact-SQL rowversion tipo di dati non è una data o un orario tipo di dati. timestamp è un sinonimo obsoleto per rowversion.

    Per ulteriori dettagli, fare riferimento qui

Lascia un commento