2011-11-14 23 views

risposta

185

SQL Server non ha nulla a che fare con una data e l'ora!

È solo una rappresentazione binaria di un numero consecutivo, è utile solo per assicurarsi che una riga non sia cambiata da quando è stata letta.

Nelle versioni più recenti di SQL Server, viene chiamato RowVersion - poiché è davvero quello che è. Vedere la MSDN docs on ROWVERSION:

è un tipo di dati che espone generate automaticamente, numeri binari unici all'interno di un database. rowversion viene generalmente utilizzato come meccanismo per le righe della tabella di stampa della versione. Il tipo di dati rowversion è solo un numero incrementale e non conserva una data o un'ora. Per registrare una data o un'ora, utilizzare un tipo di dati datetime2 .

Quindi non può convertire uno SQL Server TIMESTAMP ad una data/ora - non è solo una data/ora.

Ma se stai dicendo timestamp ma in realtà si intende una colonna di DATETIME - quindi è possibile utilizzare uno qualsiasi di questi formati di data validi descritte nell'argomento CAST and CONVERT nella Guida MSDN. Quelli sono definiti e supportati "out of the box" da SQL Server. Qualsiasi altra cosa non è supportata, ad es. devi fare un sacco di casting manuale e concatenazione (non consigliato).

Il formato che stai cercando sembra un po 'come il ODBC canonica (style = 121):

DECLARE @today DATETIME = SYSDATETIME() 

SELECT CONVERT(VARCHAR(50), @today, 121) 

dà:

2011-11-14 10:29:00.470 

SQL Server 2012 will finally have a FORMAT function fare formattazione personalizzata ... ...

+1

Probabilmente il mio più grande problema con SQL Server. Perché chiamarlo un timestamp se non posso dire il tempo con esso? – BelgoCanadian

+0

@BelgoCanadian: chiedere a Sybase: questa è una funzionalità che è sempre stata in Sybase/SQL Server ..... –

2

I miei collaboratori mi hanno aiutato con questo:

select CONVERT(VARCHAR(10), <tms_column>, 112), count(*) 
from table where <tms_column> > '2012-09-10' 
group by CONVERT(VARCHAR(10), <tms_column>, 112); 

o

select CONVERT(DATE, <tms_column>, 112), count(*) 
from table where <tms_column> > '2012-09-10' 
group by CONVERT(DATE, <tms_column>, 112); 
3

funziona bene, tranne che questo messaggio:

implicita conversione dal tipo di dati varchar al timestamp non è permesso. Utilizzare la funzione CONVERT per eseguire questa query

Quindi sì, TIMESTAMP (RowVersion) è NON un DATA :)

Per essere onesti, io fidddled intorno po 'di tempo a me stesso di trovare un modo per convertirlo in una data.

Il modo migliore è convertirlo in INT e confrontare. Questo è ciò che dovrebbe essere questo tipo. Se si desidera una data - basta aggiungere una riga Datetime e vivere happyly mai dopo :)

applausi mac

0

perché non provare FROM_UNIXTIME (UNIX_TIMESTAMP, formato)

+10

Poiché questa domanda si riferisce a SQL di Microsoft, non a MySQL. –

2

Alcuni di loro fa in realtà occulta ad un data-ora da SQL Server 2008 in poi.

Prova la seguente query SQL e vedrete voi stessi:

select CAST (0x00009CEF00A25634 as datetime) 

È possibile che questo si tradurrà in 2009-12-30 09: 51: 03: 000, ma ho incontrato quelli che in realtà non lo fanno mappa ad una data-ora.

5

Utilizzando gettato si può ottenere data da un campo timestamp:

SELECT CAST(timestamp_field AS DATE) FROM tbl_name 
+2

Questo non sembra funzionare: 'La conversione esplicita dal timestamp del tipo di dati fino alla data non è consentita. – jocull

-2

Non sono sicuro se mi manca qualcosa qui, ma non puoi semplicemente convertire il timestamp in questo modo:

CONVERT(VARCHAR,CAST(ZEIT AS DATETIME), 110) 
+0

Hai provato? TIMESTAMP non ha alcuna relazione con DATE. –

+0

Lo sto utilizzando su SQL Server 2008 – Daniel

2

Il modo più semplice per farlo è:

SELECT id,name,FROM_UNIXTIME(registration_date) FROM `tbl_registration`; 

Questo dà la colonna della data in un formato leggibile . Inoltre, se si desidera modificare il formato, fare clic su here.

+0

non sembra per le versioni precedenti di sql? Non riesco a trovarlo con sql 2014 .. – pungggi

Problemi correlati