2010-09-01 3 views
8

Devo convertire i campi Datetime in un tipo INT specificamente formattato. Ad esempio, voglio 2000-01-01 00:00:00.000 per convertire in 20010101.Modo più performante per convertire il formato da DateTime a Int

Qual è il modo più efficace per effettuare tale conversione per il confronto in una query?

Qualcosa di simile:

DATEPART(year, orderdate) * 10000 + DATEPART(month, orderdate) * 100 + 
    DATEPART(day, orderdate) 

o

cast(convert(char(8), orderdate, 112) as int) 

Qual è il modo più performante per fare questo?

+2

Risposta semplice: provare entrambi e vedere che è "migliore" (per esempio più veloce, usa meno CPU, consuma meno letture/scritture, ecc) –

+2

Come si fa 1 gennaio 2000 diventa "20.100.101" per favore? – gbn

+0

Oops, quando faccio un refuso. :) – DavidStein

risposta

19

Il tuo esempio di cast(convert(char(8), orderdate, 112) as int) sembra che vada bene a me. Porta rapidamente la data al formato desiderato e convertita in int.

Da un punto di vista del piano di esecuzione, sembra non esserci differenza tra i due.

-1

E 'questo quello che ti serve

SELECT REPLACE(CONVERT(VARCHAR(10),'2010-01-01 00:00:00.000',101),'-','') 
+1

Questo è molto più lavoro di 'cast (convert (char (8), orderdate, 112) int)', che funzionerà altrettanto bene. Il tuo esempio non prende nemmeno in considerazione la conversione in INT. – LittleBobbyTables

-2

Quando si passa '2010-01-01 00: 00: 00.000' direttamente nel codice, l'istruzione SELECT la considera come una stringa e non un tipo di dati datetime. Non è come selezionare direttamente un campo data/ora.

Non è necessario eseguire CAST esterno perché SQL Server eseguirà la conversione implicita, ecco una dimostrazione.

DECLARE @t DATETIME = '2010-01-10 00:00:00.000',@u INT 
SELECT @u = CONVERT(CHAR(8), @t, 112) 

IF ISNUMERIC(@u) = 1 
PRINT 'Integer' 
+0

Forse ciò a cui si fa riferimento è 'SELECT CONVERT (INT, CAST ('2013-08-05 09:23:30' come DATETIME))' viene da [qui] (https://msdn.microsoft.com/en -us/library/ms187928.aspx) la conversione è ** implicita ** – DanielV