从SQL Server中的选择日期时间列中获取分组中的日期

时间:2009-02-12 19:04:07

标签: sql-server sql-server-2005

我需要根据日期对某些记录进行分组,但它是一个日期和时间字段,我需要忽略时间部分,只需按日期部分分组 - 这是我现在的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 个答案:

答案 0 :(得分:23)

您可以按此分组:

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子句中的值,因为您现在正在按不同的方式进行分组。

答案 1 :(得分:13)

cast (x as date)

year(x)
month(x)
day(x)

答案 2 :(得分:2)

这个怎么样:

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

答案 3 :(得分:2)

您可以将convert类型与castconvert(date, @x) 一起使用。

cast(@x as date)

echo pathinfo(__FILE__)['filename']; // since php 5.2

答案 4 :(得分:0)

有关仅限日期功能的三个不同版本,请参阅this link。这是我最终使用的那个:

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

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

END

答案 5 :(得分:0)

您也可以使用普通的旧的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

答案 6 :(得分:0)

如果只是分组,你也可以将datetime表达式转换为int。

简单CAST(datetime AS int)实际上将日期时间舍入到最近的日期而不是删除时间部分。从那里,

CAST(datetime - 0.5 AS int)

另一种方式:

CAST(CAST(datetime AS float) AS int)

(与日期时间不同,浮点数在转换为int时会被截断。)

我更喜欢前者,因为它更短。但是,不确定在性能方面哪个更好。尽管如此,这个问题可能只会出现在真正庞大的数据阵列上。