我想为标签添加一个值。
我收到此错误:
date1_column不是公认的表提示选项。如果要将其用作表值函数或CHANGETABLE函数的参数,请确保将数据库兼容模式设置为90。
int sum;
conn.Open()
var cmd = new SqlCommand(
"SELECT
(
SELECT ISNULL(SUM(number1_column), 0)
FROM table1_name
WHERE
YEAR(date1_column) = YEAR(getdate())
AND MONTH(date1_column) = MONTH(getdate())
)
- (
SELECT ISNULL(SUM(number2_column), 0)
FROM table2_name
WHERE
YEAR(date2_column) = YEAR(getdate())
AND MONTH(date2_column) = MONTH(getdate())
)
",
conn
);
var reader = cmd.ExecuteReader();
while (reader.Read()) {
sum = (int)reader[0];
label.Text = sum.ToString();
}
conn.Close();
答案 0 :(得分:2)
如果您想让行的日期位于该月,则更好的逻辑是使用>=
和<
逻辑,因为这样可以使查询保持可保存状态:
WHERE YourDateColumn >= DATEADD(MONTH,DATEDIFF(MONTH,GETDATE()),0)
AND YourDateColumn < DATEADD(MONTH,DATEDIFF(MONTH,0,GETDATE())+1,0)
答案 1 :(得分:0)
我认为您想要这样的东西:
SELECT COALESCE(t1.sum_number1_column, 0) -
COALESCE(t2.sum_number2_column, 0)
FROM (SELECT SUM(number1_column) as sum_number1_column
FROM table1_name
WHERE date1_column >= datefromparts(year(getdate()), month(getdate()), 1) AND
date1_column < dateadd(month, 1, datefromparts(year(getdate()), month(getdate()), 1))
) t1 CROSS JOIN
(SELECT SUM(number2_column) as sum_number2_column
FROM table2_name
WHERE date2_column >= datefromparts(year(getdate()), month(getdate()), 1) AND
date2_column < dateadd(month, 1, datefromparts(year(getdate()), month(getdate()), 1))
) t2;
这个答案有几个部分。
首先,将子查询移至FROM
子句。实际上,这很方便处理NULL
值。即使没有行与WHERE
子句匹配,每个子查询也将只返回一行。
第二,它处理返回的NULL
值,因为基础表中没有行。您的版本不这样做。 NULL
需要在子查询返回之后 处理。我发现COALESCE()
中的SELECT
更加简单。
第三,日期算术使用datefromparts()
(一种非常方便的SQL Server函数)。这意味着没有神秘的日期转换。而且,生成的代码可以在日期列上使用索引。