2010-09-12 3 views
0

У меня есть этот SQL-запрос:SQL Query Group Проблема Datetime?

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

Спасибо и привет ...

ответ

2

Я думаю, что стоит размещение этого отдельно:

Использование преобразования символов для измельчения дат включения (литье или преобразование в varchar) происходит медленнее, чем использование DateAdd(Day, DateDiff(Day, 0, DateCreated), 0). Я работал full script and performance testing results to support this assertion.

SELECT DISTINCT 
    BatchCode 
    ,SUM(Quantity) as Created 
    ,TotalQuantity 
    ,Status 
    ,Destination 
    ,DateAdd(Day, DateDiff(Day, 0, DateCreated), 0) as DayCreated 
    ,CreatedBy 
FROM FGIS.dbo.DropshipPackinglist 
GROUP BY 
    BatchCode, 
    TotalQuantity, 
    Status, 
    Destination, 
    CreatedBy, 
    ModifiedBy, 
    DateDiff(Day, 0, DateCreated) -- note that the DateAdd convert back to datetime is not needed 

Кроме того, обратите внимание, что GROUP BY список не является такой же, как ваш SELECT, список так необходима некоторые настройки.

UPDATE

кажется, что экономия CPU для использования DATEADD против преобразования VARCHAR, в то время как много относительно, не много абсолютно (только доли миллисекунды в строке). Тем не менее, это по-прежнему разница в производительности, и мне лучше всего сохранить каждый бит.

+0

Я собирался сделать аналогичную запись, но у меня нет информации о времени, чтобы ее поддержать. Мне бы хотелось увидеть вашу количественную оценку * значимо медленнее *. – Gabe

+0

@Gabe в понедельник Я постараюсь опубликовать некоторую информацию для вас. То, что я обнаружил в прошлых тестах, заключается в том, что требуется больше процессорного объема, чтобы преобразовать строки, а не те, которые связаны с математикой. Это общий трюизм программирования, который я нашел единообразным во всех языках и платформах. Если есть два способа сделать что-то, и один включает математику, а другой - преобразование строк, математический путь почти всегда побеждает. Иногда есть * эффективность с использованием строк, когда математические вычисления в противном случае кропотливы, но для этой простой разницы выигрывает математика. – ErikE

+0

@Gabe Я обновил свой ответ ссылкой, пожалуйста, просмотрите его. – ErikE

4

Использование CAST or CONVERT для изменения формата DATETIME поэтому время часть опущена:

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) 
+0

+1 Это тоже было мое предположение :) – VoodooChild

+1

Я предпочитаю «КОНВЕРТ» (VARCHAR (8), [DateCreated], 112) », потому что тогда вы можете сортировать его, а также группу. Конечно, на SQL Server 2008 вы можете использовать 'CONVERT (date, [DateCreated])' и не беспокоиться о преобразовании строки. – Gabe

+0

@Gabe: Вы по-прежнему сортируете VARCHAR, используя 112 –