Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 仅获取SQL Server中“从日期时间中选择”列中分组的日期_Sql Server_Sql Server 2005 - Fatal编程技术网

Sql server 仅获取SQL Server中“从日期时间中选择”列中分组的日期

Sql server 仅获取SQL Server中“从日期时间中选择”列中分组的日期,sql-server,sql-server-2005,Sql Server,Sql Server 2005,我需要根据日期对一些记录进行分组,但这是一个日期和时间字段,我需要忽略is的时间部分,只需按日期部分进行分组-以下是我的SQL: SELECT AutoShipItems.CustomerID,AutoShipItems.NextOrderDate, Customer.FirstName,Customer.LastName, Customer.EmailAddress FROM AutoShipItems INNER JOIN

我需要根据日期对一些记录进行分组,但这是一个日期和时间字段,我需要忽略is的时间部分,只需按日期部分进行分组-以下是我的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
选择
AutoShipItems.CustomerID、AutoShipItems.NextOrderDate、,
Customer.FirstName、Customer.LastName、Customer.EmailAddress
从…起
自动装运项目
内部加入客户
AutoShipItems.CustomerID=Customer.CustomerID
哪里
(AutoShipItems.NextOrderDate)
或

您可以按以下方式分组:

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

有关仅日期函数的三个不同版本,请参阅。以下是我最后使用的一个版本:

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

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

END
那么这个呢:

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

您也可以只使用普通的SQL convert函数。最后一个参数允许您提供预先定义的日期格式,其中一些格式会删除时间。下面是修改后的查询

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
选择AutoShipItems.CustomerID,将(nvarchar(10),AutoShipItems.NextOrderDate,110)转换为NextOrderDate,Customer.FirstName,Customer.LastName,
Customer.EmailAddress
从AutoShipItems内部联接
AutoShipItems.CustomerID=Customer.CustomerID上的客户

其中(AutoShipItems.NextOrderDate如果只是关于分组,那么也可以将datetime表达式转换为int

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

CAST(datetime - 0.5 AS int)
另一种方式:

CAST(CAST(datetime AS float) AS int)
(与datetimes不同,浮点在转换为int时被截断。)

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

您可以将type与
转换一起使用,也可以使用
转换或
转换

convert(date, @x)


但是,为什么要使用111(日语)而不是112(iso)?因为iso格式112没有标点符号,所以转换回datetime可能会猜测格式错误。我希望yyyy mm dd有一种没有时间的格式;这将是我的首选。请注意转换(VARCHAR)删除时间的方法比CAST慢几倍(FLOOR(CAST或DATEADD(DATEDIFF方法也请参见:(我也进行了类似的测试)实际上,只是尝试了选择CAST(CONVERT)(VARCHAR(10),GetDate(),111)作为DATETIME)这里,它给出了我的服务器配置错误date不是MS SQL server中定义的类型。但是年、月、日工作正常。date是定义的类型-check it outDATE是在SQL2008中定义的,而不是在SQL2005或更早版本中。它看起来是迄今为止最干净的语法,对于检查日期范围的上限也很好。它是在MS SQL Server上的“我的版本”中未定义为类型2005@mson:日期在SQL Server 2005中不是可识别的类型,正如在其他一些响应中指出的那样。日期可能重复
CAST(CAST(datetime AS float) AS int)
convert(date, @x)
cast(@x as date)