2011-12-08 38 views
3

我需要過去24小時,7天期間的結果。我的預期結果需要採用以下格式:最好的方式來在SQL Server中過去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 

我認爲,對於12月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),其中包含日期,小時,分鐘和秒數。什麼是正確的方法來做到這一點?

回答

9
;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] 
+3

這很好用,但我不知道該語法中發生了什麼。 – broke

+0

「WITH」部分是[Common Table Expression](http://msdn.microsoft.com/en-us/library/ms175972(v = SQL.100).aspx)。 –

2

此數據庫中的日期字段是一個varchar(255),其中包含日期,小時,分鐘和 秒。什麼是正確的方法來做到這一點?

而這裏你的問題是。這是荒謬的;)

使OrderDate字段從一開始就是DATE。

您的方法觸發表掃描和其他不好的事情。

+0

此數據庫會將我工作中的任何員工進行預約。我知道它應該是一個日期時間字段,但我堅持它。 – broke

+2

@broke爲什麼不向表中添加新列並添加觸發器或其他適當的代碼以將varchar值轉換爲實際的日期時間值?至少,所有新的代碼和查詢都可以使用正確的數據類型,這可以解決這個問題,也可能解決其他問題。至少在理論上,您可以逐漸遷移現有代碼以使用新列,並最終完全刪除舊列。 – Pondlife

+0

@Pondlife讓這樣的變化到桌子上是一個不錯的選擇。我可以將日期轉換爲查詢中的日期時間嗎? – broke