Каков правильный синтаксис year (date_column) = year (getdate ())? - PullRequest
0 голосов
/ 07 апреля 2019

Я хочу добавить значение для метки.

Я получаю эту ОШИБКУ:

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 ]

2 голосов
/ 07 апреля 2019

Если вам нужны строки с датой в этом месяце, то лучше использовать логику >= и <, поскольку она сохраняет ваш запрос SARGable:

WHERE YourDateColumn >= DATEADD(MONTH,DATEDIFF(MONTH,GETDATE()),0)
  AND YourDateColumn < DATEADD(MONTH,DATEDIFF(MONTH,0,GETDATE())+1,0)
0 голосов
/ 08 апреля 2019

Я думаю, вы хотите что-то вроде этого:

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. Это означает, что нет никаких загадочных преобразований даты. И полученный код может использовать индекс по столбцу даты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...