Получить только дату из группировки в столбце DateTime в SQL Server - PullRequest
9 голосов
/ 12 февраля 2009

Мне нужно сгруппировать некоторые записи на основе даты, но это поле даты и времени, и мне нужно игнорировать часть времени is и просто группировать по части date - вот мой SQL в его нынешнем виде:

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

Ответы [ 7 ]

23 голосов
/ 12 февраля 2009

Вы можете сгруппировать по:

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

Я поместил это в скалярную пользовательскую функцию, чтобы упростить:

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

Который вы бы тогда назвали так:

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

Обратите внимание, что вам, возможно, придется изменить значения в предложении SELECT, поскольку теперь вы группируете что-то другое.

13 голосов
/ 12 февраля 2009
cast (x as date)

или

year(x)
month(x)
day(x)
2 голосов
/ 28 декабря 2015

Вы можете использовать тип дата с convert или cast.

convert(date, @x)

или

cast(@x as date)
2 голосов
/ 12 февраля 2009

Что по этому поводу:

select convert(datetime, convert(varchar(10), getdate(), 112))
0 голосов
/ 03 апреля 2009

Если речь идет только о группировке, вы можете также преобразовать выражение даты и времени в int.

Простой CAST(datetime AS int) фактически округляет дату и время до ближайшей даты, а не отбрасывает часть времени. Отсюда,

CAST(datetime - 0.5 AS int)

Другой способ:

CAST(CAST(datetime AS float) AS int)

(В отличие от datetime, числа с плавающей запятой усечены при приведении к int.)

Я предпочитаю первое, так как оно короче. Не уверен, что лучше с точки зрения производительности, хотя. Тем не менее, проблема, вероятно, может возникнуть только на очень больших массивах данных.

0 голосов
/ 12 февраля 2009

Вы также можете просто использовать старую функцию преобразования SQL. Последний аргумент позволяет вам указать предварительно определенные форматы даты, некоторые из которых убирают время. Вот исправленный запрос.

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 голосов
/ 12 февраля 2009

См. эту ссылку для трех различных версий функции только для даты. Вот тот, который я использовал в итоге:

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

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

END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...