我想通过日期将账单表中的金额汇总,并将其作为每日销售报告
表列是客户端名称、数量、BDate --这是我尝试过的
Dim query = "SELECT SUM(Amount)as sales FROM BillTbl where [BDate] = ? "
Dim conkey As New SqlConnection(con)
Dim cmd = New SqlCommand(query, conkey)
cmd.Parameters.AddWithValue("@BDate", Now.ToString("MM/dd/yyyy"))
conkey.Open()
Dim total As Double = Convert.ToDouble(cmd.ExecuteScalar())
check.Text = total.ToString
conkey.Close()
发布于 2022-11-21 17:36:32
假设BDate
的类型是Date
或DateTime
,而不是 varchar
(这将是非常糟糕的):
Dim query = "SELECT SUM(Amount)as sales FROM BillTbl where [BDate] = cast(current_timestamp as Date)"
Using conkey As New SqlConnection(con), _
cmd As New SqlCommand(query, con)
conkey.Open()
Dim total As Decimal = Convert.ToDecimal(cmd.ExecuteScalar())
End Using
我还想讨论查询参数,但正如您所看到的,在上面的代码中根本不需要任何参数;数据库有自己的获取当前时间的方法。因此,我将添加另一个示例,说明使用(现在不必要的)参数的正确方法:
Dim query = "SELECT SUM(Amount)as sales FROM BillTbl where [BDate] = @BDate"
Using conkey As New SqlConnection(con), _
cmd As New SqlCommand(query, con)
' Always choose an SqlDbType and Length to match the database column
cmd.Parameters.Add("@BDate", SqlDbType.Date).Value = DateTime.Today
conkey.Open()
Dim total As Decimal = Convert.ToDecimal(cmd.ExecuteScalar())
End Using
注意,查询中的参数占位符的名称与我们稍后使用的名称相匹配。还请注意,我们给了参数一个显式的类型。AddWithValue()
存在一个问题,可能导致严重的性能问题。另一个改变是用一个更安全的.Close()
块代替Using
块。如果查询有异常,则.Close()
代码可能永远不会运行,但Using
块仍将关闭连接。另外,请注意,我们从未将日期值转换为字符串。如果您发现自己将日期转换为在SQL中使用的字符串,则会出现一些非常错误的情况,特别是问题中的MM/dd/yyyy
格式对SQL不正确。
最后,请注意这两个示例中的total
变量在代码块完成后立即超出范围。您可能需要在作用域中的早期声明变量,以使其具有更大的作用域,然后此时只需设置值。
发布于 2022-11-21 14:08:04
我知道这不是一个答案,但我还不能添加评论:(。
您是否可以包括Sales
表的DDL以及一些示例数据,并包括您希望对该示例数据运行查询时会返回的结果?这可能对解决你的问题有很大的帮助。
乍一看,您的解决方案似乎应该有效,但如果没有DDL和示例数据以及所需的结果,我就无法做出明确的声明。
如果您只想按日期销售,而不考虑ClientName
,您可以尝试如下:
SELECT [BDate], SUM([Amount]) AS Sales FROM [BillTbl] GROUP BY [BDate]
如果这是Server,并且您的BDate
列也包含时间值,则可以尝试如下:
SELECT CAST([BDate] AS DATE), SUM([Amount]) AS [Sales] FROM [BillTbl] GROUP BY CAST([BDate] AS DATE)
或者,如果您的Server版本较早,则应该可以这样做:
SELECT CONVERT(VARCHAR(10), [BDate], 102), SUM([Amount]) AS [Sales] FROM [BillTbl] GROUP BY CONVERT(VARCHAR(10), [BDate], 102)
(再次抱歉,请原谅我的无知,这只是我第二次尝试回答,就像我说的,这真的应该是一个评论。)
我希望这对某些人有价值。注意:索引对我的示例查询没有多大帮助,但如果有必要,也有其他方法。
https://stackoverflow.com/questions/74519480
复制相似问题