我需要根据日期对某些记录进行分组,但它是一个日期和时间字段,我需要忽略时间部分,只需按日期部分分组 - 这是我现在的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
答案 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
类型与cast
或convert(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时会被截断。)
我更喜欢前者,因为它更短。但是,不确定在性能方面哪个更好。尽管如此,这个问题可能只会出现在真正庞大的数据阵列上。