2009-02-12 14 views
8

Necesito agrupar algunos registros basados ​​en una fecha, pero es un campo de fecha y hora y necesito ignorar la parte de tiempo de es y solo agrupar por el fecha parte - aquí está mi SQL tal y como está:Obtenga solo la fecha de la agrupación en seleccionar de la columna DateTime en SQL Server

SELECT 
    AutoShipItems.CustomerID,AutoShipItems.NextOrderDate, 
    Customer.FirstName,Customer.LastName, Customer.EmailAddress 
FROM   
    AutoShipItems 
     INNER JOIN Customer ON 
      AutoShipItems.CustomerID =Customer.CustomerID 
WHERE  
    (AutoShipItems.NextOrderDate <= GETDATE()) 
GROUP BY 
    AutoShipItems.CustomerID, AutoShipItems.NextOrderDate, 
    Customer.FirstName, Customer.LastName, 
    Customer.EmailAddress 
ORDER BY 
    AutoShipItems.NextOrderDate 
+1

duplicado posible de [Cómo devolver la parte de fecha sólo de un tipo de datos de fecha y hora de SQL Server] (http://stackoverflow.com/questions/113045/how-to-return -the-date-part-only-from-a-sql-server-datetime-datatype) –

Respuesta

22

puede agrupar por esto:

cast(floor(cast(AutoShipItems.NextOrderDate as float)) as datetime) 

Pongo esto en una función definida por el usuario escalares para que sea más fácil:

create function [dbo].[xfn_TrimTimeFromDateTime] 
(
    @date as datetime 
) 
returns datetime with schemabinding as 
begin 
    --- Convert to a float, and get the integer that represents it. 
    --- And then convert back to datetime. 
    return cast(floor(cast(@date as float)) as datetime) 
end 

Qué usted entonces llamar así:

GROUP BY 
    AutoShipItems.CustomerID, 
    dbo.xfn_TrimTimeFromDateTime(AutoShipItems.NextOrderDate), 
    Customer.FirstName, Customer.LastName, Customer.EmailAddress 

Tenga en cuenta que puede que tenga que cambiar los valores de la cláusula SELECT, ya que ahora se está agrupando por algo diferente.

+4

lol - o usted podría hacer fundido (x como la fecha) ... – mson

+0

no se define como un tipo en mi versión de MS SQL Server 2005 – Slee

+0

@mson: La fecha no es un tipo reconocido en SQL Server 2005, como lo ha sido señalado en algunas otras respuestas. – casperOne

11
cast (x as date) 

o

year(x) 
month(x) 
day(x) 
+0

La fecha no es un tipo definido en MS SQL Server. Pero el año, el mes, el día funcionan bien. –

+0

fecha es un tipo definido - Hay que ver – mson

+1

fecha en que se define en SQL2008, no en SQL2005 o versiones anteriores – Kristen

0

Consulte this link para obtener tres versiones diferentes de una función de solo fecha. Aquí está el Terminé usando:

CREATE FUNCTION [dbo].[fn_GetDateOnly] (@pInputDate DATETIME) 
RETURNS DATETIME 
BEGIN 

    RETURN CAST(CONVERT(VARCHAR(10), @pInputDate, 111) AS DATETIME) 

END 
+0

Pero, ¿por qué utilizar 111 (japonés) en lugar de 112 (ISO)? –

+0

Debido a formato ISO 112 no tiene puntuacion, es posible para la conversión posterior a la fecha y hora de adivinar el formato incorrecto. Me gustaría que hubiera un formato de aaaa-mm-dd sin tiempo; Esa sería mi preferencia. –

+0

Pls tenga en cuenta que CONVERT (el método VARCHAR para eliminar Time es varias veces más lento que CAST (FLOOR (CAST o DATEADD) (métodos DATEDIFF Vea también: http://stackoverflow.com/questions/133081/most-efficient-way-in-ms -sql-to-get-date-from-datetime (que también he probado de manera similar) – Kristen

2

Qué tal esto:

select convert(datetime, convert(varchar(10), getdate(), 112)) 
0

También se puede simplemente utilizar la función de conversión de SQL simple y llano. El último argumento le permite proporcionar formatos de fecha predefinidos, algunos de los cuales eliminan la hora. Aquí está la consulta revisada.

SELECT AutoShipItems.CustomerID, convert(nvarchar(10), AutoShipItems.NextOrderDate, 110) as NextOrderDate ,Customer.FirstName,Customer.LastName, 
        Customer.EmailAddress 
FROM  AutoShipItems INNER JOIN 
        Customer ON AutoShipItems.CustomerID =Customer.CustomerID 
WHERE  (AutoShipItems.NextOrderDate <= GETDATE()) 
GROUP BY AutoShipItems.CustomerID, convert(nvarchar(10), AutoShipItems.NextOrderDate, 110) , Customer.FirstName, Customer.LastName, 
        Customer.EmailAddress 
ORDER BY AutoShipItems.NextOrderDate 
0

Si solo se trata de agrupar, puede convertir la expresión de fecha y hora a int también.

Simple CAST(datetime AS int) realmente redondea la fecha y hora a la fecha más cercana en lugar de descartar la parte del tiempo. Desde allí,

CAST(datetime - 0.5 AS int) 

Otra forma:

CAST(CAST(datetime AS float) AS int) 

(diferencia de datetimes, flotadores se truncan cuando se convierte a int.)

Yo prefiero la primera, ya que es más corto. Sin embargo, no estoy seguro de cuál es mejor en términos de rendimiento. Aún así, el problema probablemente solo surja en grandes conjuntos de datos.

2

Puede usar el tipo date con convert o cast.

convert(date, @x) 

o

cast(@x as date) 
Cuestiones relacionadas