en SQL 2005, en lugar de construir una consulta desde dateparts año, mes y día,Get fila en la columna de fecha y hora actual = - novato del servidor SQL
¿Existe una manera más sucinta de escribir la cláusula where?
en SQL 2005, en lugar de construir una consulta desde dateparts año, mes y día,Get fila en la columna de fecha y hora actual = - novato del servidor SQL
¿Existe una manera más sucinta de escribir la cláusula where?
En SQL 2000 y SQL 2005 puede utilizar una buena instrucción de selección para eliminar el componente de tiempo de un DateTime, es decir
SELECT DATEADD(dd, DATEDIFF(dd,0,GETDATE()), 0)
devolverá 6 -Apr-2010 (solo por hoy solamente).
Así combinada con la respuesta de marc_s, te gustaría
SELECT (list of fields)
FROM dbo.YourTable
WHERE dateValue BETWEEN DATEADD(dd, DATEDIFF(dd,0,'MY Date and Time, But I Only Want Date'), 0)
AND DATEADD(dd, DATEDIFF(dd,0,'MY Date and Time, But I Only Want Date'), 1)
Editar: cambiar para adaptarse a los requisitos, tenga en cuenta el 1 en la segunda DateAdd (esto se suma los días que ha estado desde el principio hasta 1 (en vez de 0), por lo que es 7 º Abr 2010 00:00:00) Si quiere sexta Abr 23:59:59 se toma un segundo de la segunda fecha
DATEADD(ss,-1,'My DateTime')
final Call se convertiría en
DATEADD(ss,-1,DATEADD(dd, DATEDIFF(dd,0,'MY Date and Time, But I Only Want Date'), 1))
Ok eso es mucha información a la vez! Espero que todo tiene sentido :)
Me gusta su expresión para obtener la parte de fecha única mejor que mi solución, pero esta selección no funcionará, ¿no? Si tiene '2010-04-06 15:15:15', ¿cómo se compara eso con solo la parte de la fecha que va a seleccionar eso? Creo que necesitas un tipo 'WHERE dateValue BETWEEN (today) AND (today + 1 day)' para capturar todos esos valores hoy con cualquier porción de tiempo asociada a ellos .... –
Si quieres destruir completamente los índices , puede usar DateAdd/DatePart en DateValue, ¡pero esa es una mala idea! (Si tiene buenos índices :)) – PostMan
He tenido tiempos que están entre las 23: 59: 59,000 y 00: 00: 00,000 el día siguiente eliminado de los informes. así que nunca usaría el "restar un segundo método". Es mejor mantener el tiempo en 00: 00: 000.000 e incrementar un día y simplemente usar "<" menos que (suColumna
En SQL Server 2008, que tendría un nuevo tipo de datos DATE
, que se puede utilizar para lograr esto:
SELECT (list of fields)
FROM dbo.YourTable
WHERE dateValue BETWEEN
CAST(GETDATE() AS DATE) AND DATEADD(DAY, 1, CAST(GETDATE() AS DATE))
El CAST(GETDATE() AS DATE)
arroja la fecha y la hora actuales a un valor de sólo fecha, por ejemplo, devuelva '2010-04-06' para el 6 de abril de 2010. Agregar un día a eso básicamente selecciona todos los valores de fecha y hora de hoy.
En SQL Server 2005, no hay manera fácil de hacer esto - la solución más elegante I found here es el uso de la manipulación numérica de la fecha y hora a lograr el mismo resultado:
SELECT (list of fields)
FROM dbo.YourTable
WHERE dateValue BETWEEN
CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME) AND
DATEADD(DAY, 1, CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME))
@marc_s - ¿acabas de borrar tu respuesta? me asusté cuando estaba tratando de agregar un comentario. Si solo me cud mejora. Gracias por su ayuda, aunque muy apreciada. – Chin
@Chin: sí, tuve una respuesta tonta primero, la eliminé, la edité y la eliminé de nuevo :-) –
@marc_s: seguro que tiene una definición desquiciada de la palabra "elegante", +1 :) –
Algo a lo largo de las líneas de este
CONVERT(date,tbldata.date)=CONVERT(date,getdate())
Esto supone que la columna de fecha también incluye la hora. Si no lo hace, entonces usted puede cambiarlo a
tbldata.date=CONVERT(date,getdate())
Sql Server 2005 tiene un tipo 'date'? ;) –
Resulta que no es así. Mi stack actual es SQL Server 2008 ha pasado un tiempo desde que nos actualizamos y supuse que 2005 tenía esta característica. –
No es un buen rendimiento, pero una solución:
SELECT *
FROM tblDate
WHERE CONVERT(VARCHAR, date, 112) = CONVERT(VARCHAR, GETDATE(), 112);
Si se trata de una consulta común una columna calculada debe agregarse con el único contenido año-mes-día.
está en lo correcto, será lento, porque no se usará ningún índice –
He usado una UDF para hacer esto en las columnas de fecha y hora que se remontan a SQL 2000.
CREATE FUNCTION [dbo].[GETDATENOTIME](@now datetime)
RETURNS smalldatetime
AS
BEGIN
RETURN (CONVERT(smalldatetime, CONVERT(varchar, @now, 112)))
END
Uso:
DECLARE @date smalldatetime
SET @date = '4/1/10'
SELECT * FROM mytable WHERE dbo.GETDATENOTIME(date) = @date
no es lo más eficiente del mundo (dependiendo de tu caso es distinto su mesa) pero hace el trabajo.Para las tablas en las que sé que seleccionaré en función de la fecha sin tiempo, tendré una columna específica para eso con un conjunto predeterminado para dbo.GETDATENOTIME (GETDATE()).
si si alguna vez tuvo un índice en la columna "fecha", esto definitivamente no podrá usarlo y, por lo tanto, dará como resultado una exploración de la tabla ... –
De ahí mi descargo de responsabilidad al final. El OP pidió sintaxis sucinta, así que esa es la respuesta que le di. – Dane
Me pregunto si alguna de las respuestas es más sucinta que esta. Encuentro esto más legible también. donde (DATEPART (yy, myColum) = '2010') AND (DATEPART (mm, myColum) = '4') AND (DATEPART (dd, myColum) = '7'); – Chin
** @ Chin, su método evitará el uso del índice, y dará como resultado un escaneo lento de la tabla. ** Recomiendo encarecidamente que NUNCA busque basado en una fecha usando ese método. Necesita "poner" las fechas en el rango y no aplicar funciones a la columna si desea usar un índice. esta es la forma de poner al día una fecha y hora: http://stackoverflow.com/questions/85373/floor-a-date-in-sql-server –
@KM, gracias por eso. Pensé en preguntar y ver si estaba fuera de la base. Actualmente no estoy al tanto de un índice en esta columna. Sin embargo, lo tendré en cuenta y pondré al día mis fechas tal como me sugirió. – Chin