Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.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查询按日期时间分组问题?_Sql_Sql Server_Tsql - Fatal编程技术网

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

我有一个SQL查询:

  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是很容易的,我们获得的任何性能增益都不会影响性能