2012-05-01 21 views
53

¿Hay alguna manera de usar la función Now() en SQL para seleccionar valores con la fecha actual? Tenía la impresión de que Now() contendría la hora y la fecha, pero la fecha de hoy tendría el tiempo establecido en 00:00:00 y, por lo tanto, esto nunca coincidiría.¿Comparando resultados con la fecha de hoy?

+0

por favor, puesto que su estructura de la tabla. ¿Sus valores de fecha en la tabla tienen un componente de tiempo? –

+0

Por favor, publique el resultado que desea. –

+0

Posible duplicado http://stackoverflow.com/questions/1177449/best-approach-to-remove-time-part-of-datetime-in-sql-server – GarethD

Respuesta

61

No hay nativa Ahora() en SQL Server lo que debe utilizar:

select GETDATE() --2012-05-01 10:14:13.403 

usted puede conseguir el día, mes y año por separado haciendo:

select DAY(getdate()) --1 
select month(getdate()) --5 
select year(getdate()) --2012 

si están en sql server 2008, existe la fecha de fecha FECHA que tiene solo la parte de la fecha, no la hora:

select cast (GETDATE() as DATE) --2012-05-01 
+2

Ahora es una función ODBC, por lo que puede invocarse en MSSQL utilizando select {fn Now()} – Paul

69

Bien, hagamos esto correctamente. Seleccione las fechas coincidentes hoy, usando índices si están disponibles, con todos los diferentes tipos de fecha y hora presentes.

El principio aquí es el mismo en cada caso. Tomamos las filas donde está la columna de fecha o después de la medianoche más reciente (fecha de hoy con hora 00:00:00) y antes de la próxima medianoche (fecha de mañana con hora 00:00:00, pero excluyendo cualquier cosa con ese valor exacto)

Para los tipos de fecha pura, podemos hacer una comparación simple con la fecha de hoy.

Para mantener las cosas buenas y rápidas, evitamos explícitamente cualquier manipulación de las fechas almacenadas en el DB (el LHS de la cláusula where en todos los ejemplos a continuación). Esto podría desencadenar un escaneo de tabla completo ya que la fecha tendría que calcularse para cada comparación. (Este comportamiento parece variar según DBMS, YMMV).

MS SQL Server: (SQL Fiddle)

primer lugar, utilizando FECHA

select * from dates 
where dte = CAST(CURRENT_TIMESTAMP AS DATE) 
; 

Ahora con DATETIME:

select * from datetimes 
where dtm >= CAST(CURRENT_TIMESTAMP AS DATE) 
and dtm < DATEADD(DD, 1, CAST(CURRENT_TIMESTAMP AS DATE)) 
; 

Por último, con DATETIME2:

select * from datetimes2 
where dtm2 >= CAST(CURRENT_TIMESTAMP AS DATE) 
and dtm2 < DATEADD(DD, 1, CAST(CURRENT_TIMESTAMP AS DATE)) 
; 

MySQL: (SQL Fiddle)

usando fecha:

select * from dates 
where dte = cast(now() as date) 
; 

Usando DATETIME:

select * from datetimes 
where dtm >= cast((now()) as date) 
and dtm < cast((now() + interval 1 day) as date) 
; 

PostgreSQL: (SQL Fiddle)

usando fecha:

select * from dates 
where dte = current_date 
; 

Usando TIMESTAMP sin tiempo ZONA:

select * from timestamps 
where ts >= 'today' 
and ts < 'tomorrow' 
; 

Oracle: (SQL Fiddle)

usando fecha:

select to_char(dte, 'YYYY-MM-DD HH24:MI:SS') dte 
from dates 
where dte >= trunc(current_date) 
and dte < trunc(current_date) + 1 
; 

Usando TIMESTAMP:

select to_char(ts, 'YYYY-MM-DD HH24:MI:SS') ts 
from timestamps 
where ts >= trunc(current_date) 
and ts < trunc(current_date) + 1 
; 

SQLite: (SQL Fiddle)

Uso de cadenas de fecha:

select * from dates 
where dte = (select date('now')) 
; 

el uso de cadenas de fecha y hora:

select dtm from datetimes 
where dtm >= datetime(date('now')) 
and dtm < datetime(date('now', '+1 day')) 
; 

Uso de marcas de tiempo UNIX:

select datetime(dtm, 'unixepoch', 'localtime') from datetimes 
where dtm >= strftime('%s', date('now')) 
and dtm < strftime('%s', date('now', '+1 day')) 
; 

Backup of SQL Fiddle code

+1

Usando 'CONVERTIR (VARCHAR' para comparar fechas no es el mejor enfoque. Es mejor mantener las fechas como fechas (por ejemplo, 'CAST (CURRENT_TIMESTAMP AS DATE)' o 'DATEADD (DAY, 0, DATEDIFF (DAY, 0, CURRENT_TIMESTAMP))'. http://stackoverflow.com/questions/1177449/mejor-aproximación-a-eliminar-tiempo-parte-de-fecha-hora-en-servidor-sql – GarethD

+0

Gracias GarethD, he actualizado mi respuesta – dwurf

+0

¿Estaba realmente después del servidor SQL? :) – mezamorphic

4
No

seguro exactamente lo que estamos tratando de hacer, pero suena como GETDATE() es lo que está buscando . GETDATE() devuelve una fecha y hora, pero si no está interesado en el componente de tiempo, puede enviar una fecha.

SELECT GETDATE() 
SELECT CAST(GETDATE() AS DATE) 
4

Just zero off the time element of the date. p.ej.

select DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0) 

He usado GetDate ya que es una función de MSSQL, como se ha etiquetado, pero ahora() es probablemente MySQL o que está utilizando la llamada de función ODBC, debería funcionar si sólo se reemplaza con uno el otro.

6

¡No estoy seguro de lo que está pidiendo!

Sin embargo

SELECT GETDATE() 

le dará el fecha y hora actuales

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

le conseguirá sólo la fecha con el tiempo ajustado en 00:00:00

3

Sobre la base del anterior respuestas, tenga en cuenta un punto importante, también necesita manipular la columna de la tabla para asegurarse de que no contiene el fragmento de tiempo de la fecha tipo de datos Ime.

A continuación se muestra un pequeño script de ejemplo que demuestra lo anterior:

select getdate() 
--2012-05-01 12:06:51.413 
select cast(getdate() as date) 
--2012-05-01 

--we're using sysobjects for the example 
create table test (id int) 
select * from sysobjects where cast(crdate as date) = cast(getdate() as date) 
--resultset contains only objects created today 
drop table test 

espero que esto ayude.

EDIT:
siguiente comentario @dwurf (gracias) por el efecto del ejemplo anterior puede tener en el rendimiento, me gustaría sugerir la siguiente vez. Creamos un rango de fechas entre hoy a la medianoche (inicio del día) y el último milisegundo del día (el servidor SQL cuenta hasta .997, por eso reduzco 3 milisegundos). De esta manera evitamos manipular el lado izquierdo y evitar el impacto en el rendimiento.

select getdate() 
--2012-05-01 12:06:51.413 
select dateadd(millisecond, -3, cast(cast(getdate()+1 as date) as datetime)) 
--2012-05-01 23:59:59.997 
select cast(getdate() as date) 
--2012-05-01 

create table test (id int) 
select * from sysobjects where crdate between cast(getdate() as date) and dateadd(millisecond, -3, cast(cast(getdate()+1 as date) as datetime)) 
--resultset contains only objects created today 
drop table test 
+0

No siempre es lo mejor que puedes hacer. Si tienes un millón de fechas en una mesa, esto arruinará rápidamente tu plan de ejecución. – dwurf

1

Si usted tiene una mesa con sólo una fecha almacenada (sin tiempo) y desea obtener los de "ahora", entonces usted puede hacer esto:

SELECT * FROM tbl WHERE DATEDIFF(d, yourdate, GETDATE())=0 

Esto resulta en filas qué día la diferencia es 0 (así que hoy).

0

Puede probar este código sql;

SELECT [column_1], [column_1], ...  
    FROM (your_table) 
    where date_format(record_date, '%e%c%Y') = date_format(now(), '%e%c%Y') 
0

donde created_date entre CURRENT_TIMESTAMP-180 y CURRENT_TIMESTAMP

Cuestiones relacionadas