2009-11-11 13 views
13

Qual è l'equivalente di:Trunc (sysdate) in SQL Server

TRUNC(SYSDATE) 

... in SQL Server 2005?

+3

30 domande, nessuna risposta accettato? Perché preoccuparsi? – RRUZ

+2

La domanda è legittima: l'OP vuole l'equivalente della funzionalità ORACLE. –

+0

Grazie, Dominic :) –

risposta

17

consigliati:

DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE())) 

Questa è un'altra alternativa, ma è rischioso a causa di fusione ad un galleggiante. È stato anche dimostrato di non scalare le prestazioni e l'approccio DATEADD/DATEDIFF.

CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME) 
+5

Devo fare tutto ciò solo per ottenere TRUNC()? –

+0

Funziona, ma sarebbe più corretto passare il 2 ° e il 3 ° argomento di DATEADD. Il secondo argomento è l'incremento, quindi stai aggiungendo 0 ai giorni restituiti da DATEDIFF. – djs

1

Un'altra opzione è quella di utilizzare CONVERT (MSSQL 2008 e versioni successive) e usare sia uno stile appropriato o utilizzare uno stile che si può quindi SUBSTRING. Non ho idea delle prestazioni rispetto alla soluzione dateadd/datediff però.

ad es.

SELECT SUBSTRING(CONVERT(nvarchar(30), GETDATE(), 120), 1, 16)

Returns:

2012-01-03 15:30

Esempio con gruppo che elenca le righe create al minuto (presuppone una colonna 'creato' datetime):

SELECT SUBSTRING(CONVERT(nvarchar(30), created, 120), 1, 16) as [minute] 
, COUNT(1) as [per min] 
FROM foo 
GROUP BY SUBSTRING(CONVERT(nvarchar(30), created, 120), 1, 16) 
+2

Se si utilizza SQL Server 2008 o versioni successive, utilizzare CONVERT (date, getdate()). Il tipo di dati "Data" non memorizza le informazioni sull'ora. – Baodad