sql - query - Comparando resultados con la fecha de hoy?
sql server datetime equal today (9)
¡No estoy seguro de lo que estás pidiendo!
sin embargo
SELECT GETDATE()
Te dará la fecha y hora actual
SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))
Te conseguirá la fecha con el tiempo establecido en 00:00:00
¿Hay alguna forma de utilizar 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.
No estoy seguro exactamente de lo que intenta hacer, pero parece que GETDATE()
es lo que está buscando. GETDATE()
devuelve una fecha y hora, pero si no está interesado en el componente de tiempo, puede lanzar una fecha.
SELECT GETDATE()
SELECT CAST(GETDATE() AS DATE)
Si tiene una tabla con solo una fecha almacenada (sin tiempo) y desea obtenerla por "ahora", puede hacer esto:
SELECT * FROM tbl WHERE DATEDIFF(d, yourdate, GETDATE())=0
Esto da como resultado filas cuya diferencia de día es 0 (así que hoy).
Sobre la base de las respuestas anteriores, tenga en cuenta un punto importante, también debe manipular la columna de la tabla para asegurarse de que no contiene el fragmento de tiempo del tipo de datos datetime.
A continuación se muestra un pequeño script de muestra 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.
EDITAR:
Siguiendo el comentario de @dwurf (gracias) sobre el efecto que el ejemplo anterior puede tener en el rendimiento, me gustaría sugerir lo siguiente en su lugar. 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
No existe una función nativa de Now () en SQL Server, por lo que debe usar:
select GETDATE() --2012-05-01 10:14:13.403
puede obtener el día, mes y año por separado haciendo:
select DAY(getdate()) --1
select month(getdate()) --5
select year(getdate()) --2012
si está en el servidor sql 2008, existe la fecha de fecha FECHA que tiene solo la fecha, no la hora:
select cast (GETDATE() as DATE) --2012-05-01
Simplemente ponga a cero el elemento de tiempo de la fecha. p.ej
select DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0)
He usado GetDate ya que es una función MSSQL, ya que has etiquetado, pero Now () es probablemente MySQL o estás usando la llamada a la función ODBC, aún debería funcionar si simplemente reemplazas una con la otra.
OK, 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 tipos de fecha pura, podemos hacer una comparación simple con la fecha de hoy.
Para mantener las cosas de forma rápida y agradable, 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).
Servidor MS SQL: ( SQL Fiddle )
Primero, usando DATE
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)
;
Utilizando 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
;
Uso de TIMESTAMP WITH TIME ZONE:
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 )
Usar cadenas de fecha:
select * from dates
where dte = (select date(''now''))
;
Usar cadenas de fecha y hora:
select dtm from datetimes
where dtm >= datetime(date(''now''))
and dtm < datetime(date(''now'', ''+1 day''))
;
Usando marcas de tiempo de Unix:
select datetime(dtm, ''unixepoch'', ''localtime'') from datetimes
where dtm >= strftime(''%s'', date(''now''))
and dtm < strftime(''%s'', date(''now'', ''+1 day''))
;
Puedes 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'')
donde created_date entre CURRENT_TIMESTAMP-180 y CURRENT_TIMESTAMP