Sql server 在sql server中度过7天的最佳方法?

Sql server 在sql server中度过7天的最佳方法?,sql-server,sql-server-2005,sql-server-2008,tsql,Sql Server,Sql Server 2005,Sql Server 2008,Tsql,我需要过去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.W

我需要过去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
我认为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)
,其中包含日期、小时、分钟和秒。做这件事的正确方法是什么

此数据库中的日期字段是一个varchar(255),其中包含日期、小时、分钟和分钟 秒。做这件事的正确方法是什么

这是你的问题。这是荒谬的;)

将OrderDate字段设置为起始日期

你的方法会触发表格扫描和其他不好的事情。

;以[cteOrders]作为
;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]
( 选择转换(日期,[OrderDate])作为[OrderDate], 将(货币,[总行数] 来自[dbo]。[订单] ) 选择[OrderDate], 将(*)计为[行], 总和([总行数]净额)为[总计] 从[cteOrders]
其中,DATEDIFF(DAY,[OrderDate],GETDATE())这个数据库在我工作的任何员工之前就存在。我知道它应该是一个datetime字段,但我一直在使用它。@为什么不向表中添加一个新列并添加触发器或任何其他适合将varchar值转换为实时datetime值的代码?至少您的所有新代码和查询都可以使用正确的数据类型,这将解决这个问题,也可能解决其他问题。至少在理论上,您可以逐渐迁移现有代码以使用新列,并最终完全删除旧列。@Pondlife对表进行这样的更改是不可能的。我是否可以在查询中将日期强制转换为datetime?@Break,想想“computed column”。每次运行查询时,您都将无休止地强制转换varchar日期,或者您可以在插入/更新时间内执行一次,并在此后一直正确(快速)查询和索引这些日期。@Pondlife您能在回答中解释一下吗?我仍然是sql的高手。这很好用,但我不知道语法是怎么回事。
with
部分是一个很好的例子。