Für alle diejenigen, die noch wissen was die DOS Eingabeaufforderung ist :)
SELECT DATEADD(day, 0 , DATEDIFF(day, 0, MsgDateReceived)) AS "Datum" , COUNT(*) AS Anzahl FROM mails_header GROUP BY DATEADD(day, 0 , DATEDIFF(day, 0, MsgDateReceived)) ORDER BY "Datum" DESC
SET NOCOUNT ON DECLARE @hex VARCHAR(10) DECLARE @stmt NVARCHAR(255) DECLARE @int INT SET @hex = '0x0000008A' SELECT @stmt = N'SELECT @int = CONVERT( int , ' + @hex + ' )' EXEC sp_ExecuteSql @stmt, N' @int Int Out', @int OUT SELECT @int GO GO GO ----------- 138
DELETE logged die Daten für jede einzelne Zeile, die von dem Statement betroffen sind und entfernt physikalisch den Record aus der Seite. Fährt man seine Datenbanken im "Full Recovery" Modus, kann die Aufzeichnung eines jeden einzelnen betroffenen Datensatzes das Transaktionsprotokoll enorm aufblähen. Dies ist aber notwendig, damit SQL Server im Falle einen Falles die Datenbank so aktuell wie möglich wiederherstellen kann. Der Umstand, das jeder Datensatz protokolliert wird, macht auch verständlich, daß umfangreiche DELETE Operationen langsam sind.
SELECT YEAR(GETDATE())*1000 + DATEPART(y,GETDATE()) AS the_date the_date ----------- 2004182 (1 row(s) affected)
Danke an Jonathan van Houtte!
Der Unterschied zwischen beiden Datentypen ist mehr als subtil im SQL 92 Standard.
DECLARE @d DATETIME SET @d = '23.07.1968' SELECT DATEDIFF(yyyy,CAST(@d AS DATETIME),GETDATE()) - (CASE WHEN DATEADD(yyyy,DATEDIFF(yyyy,CAST(@d AS DATETIME),GETDATE()),CAST(@d AS DATETIME)) > GETDATE() THEN 1 ELSE 0 END) ----------- 35 (1 row(s) affected)