2011-01-26 64 views
53
DELETE from Table WHERE Date > GETDATE(); 

GETDATE() incluye el tiempo. En lugar de obtener¿Cómo obtengo solo la fecha cuando uso MSSQL GetDate()?

2011-01-26 14:58:21.637 

¿Cómo puedo obtener:

2011-01-26 00:00:00.000 
+1

Además, tenga en cuenta que es posible que desee '> =' en lugar de '>' , o realmente se perderá la eliminación de registros que son exactamente 2011-01-26 00: 00: 00.000 ... –

+0

Buena llamada, de hecho cambié eso antes de leer este comentario :) – sooprise

+0

Una solución simple be 'cast (left (getdate(), 11) como datetime)' –

Respuesta

64

sesgo leve a SQL Server

Resumen

DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0) 

SQL Server 2008 tiene date tipo embargo. Así que sólo tiene que utilizar

CAST(GETDATE() AS DATE) 

Editar: Para añadir un día, comparar con el día anterior a "cero"

DATEADD(day, DATEDIFF(day, -1, GETDATE()), 0) 

De cyberkiwi:

Una alternativa que no implique 2 funciones es (la +1 puede estar dentro o entre los corchetes).

DATEDIFF(DAY, 0, GETDATE() +1) 

DateDiff devuelve un número, pero a todos los efectos que esto funcionará como una fecha donde quiera que vaya a utilizar esta expresión, a excepción de su conversión a VARCHAR directamente - en cuyo caso se habría utilizado el enfoque convertir directamente en GETDATE (), p.ej

convert(varchar, GETDATE() +1, 102) 
+0

¿Cómo agrego un día a este valor? – sooprise

+1

select CAST (GETDATE() + 1 AS DATE) – eidgenossen

+0

@eidgenossen: Simple, pero se basa en una conversión implícita. Menos claro. – gbn

5
SELECT CONVERT(DATETIME, CONVERT(varchar(10), GETDATE(), 101)) 
+1

¿Para qué sirve el 101? – sooprise

+0

Determina el formato de la cadena de salida, en este caso mm/dd/aaaa hh: mm: ss. De ahí el varchar (10) que trunca la porción de tiempo. – JohnOpincar

7

Es base de datos específica. No ha especificado qué motor de base de datos está utilizando.

p. Ej. en PostgreSQL haces cast (myvalue como date).

+3

¿Quieres decir GETDATE() no es suficiente una pista? – RichardTheKiwi

+0

Creo que el OP dijo "MSSQL" –

-1
CONVERT(varchar,GETDATE(),102) 
+0

¿Para qué sirve el 102? – sooprise

+0

Los 101, 102, etc. son solo parámetros para la función CONVERT. Creo que en realidad podría querer usar 101, que es en forma de mm/dd/aaaa, mientras que 102 está en la forma mm.dd.aaaa, creo ... – Saggio

+0

Eso devuelve una cadena. En lugar de confiar en la conversión implícita, es mejor lanzarla a una fecha explícitamente. – Leigh

9

Para SQL Server 2008, el mejor y el índice de forma amigable es

DELETE from Table WHERE Date > CAST(GETDATE() as DATE); 

Para versiones anteriores de SQL Server, las matemáticas fecha funcionarán más rápido que un convertido a VARCHAR. Incluso la conversión a varchar puede darle un resultado incorrecto, debido a la configuración regional.

DELETE from Table WHERE Date > DATEDIFF(d, 0, GETDATE()); 

Nota: no es necesario para envolver el DATEDIFF con otro DATEADD

+0

El estilo "anterior" sin DATEADD se basa en la conversión implícita de int a la fecha según [precedence] (http://msdn.microsoft.com/en-us/library/ms190309.aspx). Esto es efectivamente DATEADD en la práctica, ¿no? Prefiero conversiones explícitas, aunque esto se vea más limpio. – gbn

+0

No estoy seguro de cómo lo hace QO, pero no hay ninguna razón para solicitar manualmente un DATEADD. Aunque el tipo de datos es datetime, 'internamente' cuando se compara, se convierte en un valor numérico, por lo que puede ser mejor dejarlo solo como un int. – RichardTheKiwi

0

Usted puede utilizar

DELETE from Table WHERE Date > CONVERT(VARCHAR, GETDATE(), 101); 
+0

Eso devuelve una cadena. Lo mejor es no confiar en la conversión implícita. En lugar de eso, transfiéralo a una fecha o fecha/hora explícitamente. – Leigh

Cuestiones relacionadas