Лучший способ получить последние 7 дней на сервере SQL? - PullRequest
3 голосов
/ 08 декабря 2011

Мне нужны результаты за последние 24 часа, 7 дней. Мои желаемые результаты должны быть в этом формате:

2011-11-05   11 orders  $12354.94
2011-11-04   12 orders  $12555.72
2011-11-03   5 orders  $1000.24

Экспериментируя с некоторыми запросами, я получаю различное количество возвращаемых строк. Например, этот запрос:

SELECT CAST(Left(OrderDate,10) as smalldatetime) as PurchaseDate,
       COUNT(Orders.WebOrderNumber) as "Rows",
       SUM(cast(Orders.Total_Lines_Net AS money)) as Total
FROM Orders 
WHERE OrderDate  BETWEEN getdate() - 7 AND getdate() 
GROUP BY cast(Left(OrderDate,10) as smalldatetime)
ORDER BY cast(Left(OrderDate,10) as smalldatetime)

Возвращает эти данные:

   PurchaseDate Rows    Total
2011-12-01 00:00:00 1539    404798.85
2011-12-02 00:00:00 1572    324963.604
2011-12-03 00:00:00 970 119244.93
2011-12-04 00:00:00 1092    120888.244
2011-12-05 00:00:00 1201    337646.952
2011-12-06 00:00:00 1309    287609.243
2011-12-07 00:00:00 1555    315223.22

Я думал, что строки на 1 декабря кажутся низкими, поэтому я попробовал другой запрос:

SELECT   SUM(cast(Orders.Total_Lines_Net AS money)) as Total,
         COUNT(Orders.WebOrderNumber) as "Rows",
         CAST(Left(OrderDate,10) as smalldatetime) as PurchaseDate
FROM Orders 
WHERE OrderDate between '2011-12-01 00:00:00' AND  + '2011-12-01 23:59:59'
GROUP BY cast(Left(OrderDate,10) as smalldatetime)

, который возвращает 2597 строк. Первый запрос не возвращает полный 24-часовой период? Поле даты в этой базе данных - varchar(255), которое содержит дату, часы, минуты и секунды. Какой правильный способ сделать это?

Ответы [ 2 ]

9 голосов
/ 08 декабря 2011
;WITH [cteOrders] AS
(
    SELECT  CONVERT(DATE, [OrderDate]) AS [OrderDate],
            CONVERT(MONEY, [Total_Lines_Net]) AS [Total_Lines_Net]
    FROM [dbo].[Orders]
)
SELECT  [OrderDate],
        COUNT(*) AS [Rows],
        SUM([Total_Lines_Net]) AS [Total]
FROM [cteOrders]
WHERE DATEDIFF(DAY,[OrderDate],GETDATE()) <= 7
GROUP BY [OrderDate]
ORDER BY [OrderDate]
2 голосов
/ 08 декабря 2011

Поле даты в этой базе данных - это varchar (255), который содержит дату, час, минуту и секунд. Какой правильный способ сделать это?

И вот ваша проблема. Это смешно;)

Сделать поле OrderDate ДАТА от начала.

Ваш подход вызывает сканирование таблицы и другие плохие вещи.

...