什么是正确的语法year(date_column)= year(getdate())?

时间:2019-04-07 19:50:19

标签: c# sql sql-server

我想为标签添加一个值。

我收到此错误:

  

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();

2 个答案:

答案 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函数)。这意味着没有神秘的日期转换。而且,生成的代码可以在日期列上使用索引。