SQL查询按日期时间分组问题?
我有一个SQL查询:SQL查询按日期时间分组问题?,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一个SQL查询: SELECT DISTINCT [BatchCode] ,SUM([Quantity]) as 'Created' ,[TotalQuantity] ,[Status] ,[Destination] ,[DateCreated] ,[CreatedBy] FROM [FGIS].[dbo].[DropshipPackinglist] G
SELECT DISTINCT
[BatchCode]
,SUM([Quantity]) as 'Created'
,[TotalQuantity]
,[Status]
,[Destination]
,[DateCreated]
,[CreatedBy]
FROM [FGIS].[dbo].[DropshipPackinglist]
GROUP BY BatchCode, TotalQuantity, Status, Destination, CreatedBy, ModifiedBy, DateCreated
结果是:
BatchCode Created TotalQuantity Status Destination DateCreated CreatedBy
---------------------------------------------------------------------------------------------------------------
0005041007100AHWA11HG 86 86 CREATED MediTelecom S.A. 2010-09-10 00:00:00.000 NULL
0005041007100AHWA11HGK 19 50 ALLOCATED USA 2010-09-12 07:35:17.000 jy
0005041007100AHWA11HGK 31 50 ALLOCATED USA 2010-09-12 07:35:20.000 jy
我现在的问题是无法对DateCreated进行分组,因为它有不同的时间 我只想按日期分组。示例:2010-09-12 感谢并问候…用于更改日期时间格式,以便省略时间部分:
SELECT [BatchCode],
SUM([Quantity]) as 'Created',
[TotalQuantity],
[Status],
[Destination],
CONVERT(VARCHAR(10), [DateCreated], 101) AS datecreated,
[CreatedBy]
FROM [FGIS].[dbo].[DropshipPackinglist]
GROUP BY BatchCode,
TotalQuantity,
Status,
Destination,
CreatedBy,
ModifiedBy,
CONVERT(VARCHAR(10), [DateCreated], 101)
用于更改日期时间格式,以便省略时间部分:
SELECT [BatchCode],
SUM([Quantity]) as 'Created',
[TotalQuantity],
[Status],
[Destination],
CONVERT(VARCHAR(10), [DateCreated], 101) AS datecreated,
[CreatedBy]
FROM [FGIS].[dbo].[DropshipPackinglist]
GROUP BY BatchCode,
TotalQuantity,
Status,
Destination,
CreatedBy,
ModifiedBy,
CONVERT(VARCHAR(10), [DateCreated], 101)
我想这是值得单独发布的:
使用字符转换切掉时间截止日期(强制转换或转换为varchar)比使用
DateAdd(Day,DateDiff(Day,0,DateCreated),0)
慢。我兴奋起来了
另外,请注意,您的分组列表与选择列表不同,因此需要进行一些调整
更新
似乎使用DateAdd与varchar转换节省的CPU相对来说是很多的,但绝对不是很多(每行只有几毫秒)。然而,这仍然是一个性能差异,在我看来,最好是尽可能节省每一点。我想这是值得单独发布的:
使用字符转换切掉时间截止日期(强制转换或转换为varchar)比使用
DateAdd(Day,DateDiff(Day,0,DateCreated),0)
慢。我兴奋起来了
另外,请注意,您的分组列表与选择列表不同,因此需要进行一些调整
更新
似乎使用DateAdd与varchar转换节省的CPU相对来说是很多的,但绝对不是很多(每行只有几毫秒)。但是,这仍然是一个性能差异,在我看来最好是尽可能地保存每一位。我更喜欢
CONVERT(VARCHAR(8),[DateCreated],112)
,因为这样您就可以按它排序,也可以按它分组。当然,在SQL Server 2008上,您可以使用CONVERT(date,[DateCreated])
,而不必担心字符串转换。@Gabe:您仍然在使用112OMG Ponies按VARCHAR排序:我只是说,如果您使用112
,则会得到一个字符串,其中按字典顺序排序也按时间顺序排序。按101
转换的字符串排序不会按时间顺序给出结果,因此一般来说112
比101
更有效。使用字符转换来切掉时间截止日期要比使用DateAdd(Day,DateDiff(Day,0,DateCreated),0慢得多
请参见我关于转换性能的声明。我更喜欢CONVERT(VARCHAR(8),[DateCreated],112)
,因为这样您可以按它排序,也可以按它分组。当然,在SQL Server 2008上,您可以使用CONVERT(date,[DateCreated])
,而不必担心字符串转换。@Gabe:您仍然在使用112OMG Ponies按VARCHAR排序:我只是说,如果您使用112
,则会得到一个字符串,其中按字典顺序排序也按时间顺序排序。按101
转换的字符串排序不会按时间顺序给出结果,因此一般来说112
比101
更有效。使用字符转换来切掉时间截止日期要比使用DateAdd(Day,DateDiff(Day,0,DateCreated),0慢得多
请看我关于转换性能的声明。我本打算发表一篇类似的文章,但我没有任何时间信息来支持。我很想看到你对速度慢得有意义的量化。@Gabe周一我将试着为你发布一些信息。我在过去的测试中发现,进行字符串转换比进行涉及数学的转换要花费大量CPU。这是一个普遍的编程真理,我发现它在所有语言和平台上都是一致的。如果有两种方法做某事,一种涉及数学,另一种涉及字符串转换,那么数学方法几乎总是赢的。有时,当数学计算很费劲时,使用字符串会有效率,但对于这种简单的差异,数学会胜出。因此,字符串转换似乎需要2.5us,而方法大约需要0.9us。换句话说,你的查询必须有一百万行才能让你的查询变得有意义的慢。谢谢你用现实世界的术语来表达,Gabe。也许“有意义的”是一个糟糕的词语选择。在现实世界中,每行只节省一点点可能没那么重要。另一方面,切换到DateDiff很容易,我们获得的任何性能提升都会减轻服务器上的负载。你能发布你的2.5微秒和0.9微秒计算的数字吗?@Gabe好的,我知道你从哪里得到的。我认为减去明显的基本CPU成本是有意义的,所以我得到了大约1.8μs和0.18μs。我本来打算写一篇类似的文章,但我没有任何时间信息来支持它。我很想看到你对速度慢得有意义的量化。@Gabe周一我将试着为你发布一些信息。我在过去的测试中发现,进行字符串转换比进行涉及数学的转换要花费大量CPU。这是一个普遍的编程真理,我发现它在所有语言和平台上都是一致的。如果有两种方法做某事,一种涉及数学,另一种涉及字符串转换,那么数学方法几乎总是赢的。有时,当数学计算很费劲时,使用字符串会有效率,但对于这种简单的差异,数学会胜出。因此,字符串转换似乎需要2.5us,而方法大约需要0.9us。换句话说,你的查询必须有一百万行才能让你的查询变得有意义的慢。谢谢你用现实世界的术语来表达,Gabe。也许“有意义的”是一个糟糕的词语选择。在现实世界中,每行只节省一点点可能没那么重要。另一方面,切换到DateDiff是很容易的,我们获得的任何性能增益都不会影响性能