2009-02-12 57 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)