2009-02-12 33 views
8

我需要根据日期对一些记录进行分组,但它是日期和时间字段,我需要忽略is的时间部分,日期部分 - 这里是我的SQL,因为它代表:只需从SQL Server中的DateTime列中选择分组的日期

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

的可能的复制[如何只从SQL Server datetime数据类型返回日期部分(http://stackoverflow.com/questions/113045/how-to-return date-part-only-from-a-sql-server-datetime-datatype) – 2016-10-28 19:38:07

回答

22

您可以通过这组:

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子句,因为你现在正在按不同的东西分组。

11
cast (x as date) 

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

日期不是MS SQL Server中定义的类型。但是,年,月,日工作很好。 – 2009-02-12 19:31:14

+0

日期是一种定义的类型 - 检查出 – mson 2009-02-12 21:58:22

+1

DATE在SQL2008中定义,而不是在SQL2005或更早版本中 – Kristen 2009-02-19 21:00:55

0

请参阅this link三个不同版本的日期功能。这里是一个我最终使用:

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

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

END 
2

这个怎么样:

select convert(datetime, convert(varchar(10), getdate(), 112)) 
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 
0

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

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

CAST(datetime - 0.5 AS int) 

另一种方式:

CAST(CAST(datetime AS float) AS int) 

(不像日期时间,强制转换为int花车时被截断。)

我更喜欢前者,因为它更短。不过,不确定在性能方面哪个更好。不过,这个问题可能只会出现在真正的大数据数组上。

2

您可以使用dateconvertcast

convert(date, @x) 

cast(@x as date) 
相关问题