2014-07-16 2 views
2

В настоящее время я работаю над заданием SQL с функцией sum, которая суммирует некоторые значения цены в течение дня. Я смог успешно реализовать эту функцию, но в настоящее время есть проблемы с полуночными значениями.Значения Midnight, не включенные в SUM (MS SQL)

Таблица макет:

Hour     | price | sum function 
------------------------------------ 
'2014-07-07 06:00:00' | 0  | NULL 

'2014-07-07 07:00:00' | 0  | NULL 

'2014-07-07 08:00:00' | 1000 | NULL 

'2014-07-07 09:00:00' | 1200 | NULL 

'2014-07-07 10:00:00' | 1300 | NULL 

'2014-07-07 11:00:00' | 700 | NULL 

'2014-07-07 12:00:00' | 800 | NULL 

'2014-07-07 13:00:00' | 2000 | 5000 

'2014-07-07 14:00:00' | 3500 | NULL 

'2014-07-07 15:00:00' | 2500 | NULL 

'2014-07-07 16:00:00' | 1000 | 13000 

'2014-07-07 17:00:00' | 500 | NULL 

Задача:

Проблема существует, когда час, из приведенных выше таблиц, встречает полночь. Дело в 01 часах (в предыдущий день). Меня интересует наличие суммы предыдущего дня с 06-00 часов таким же образом, как показано в таблице выше в течение дня. Моя текущая сумма работает хорошо с 06-23, но возвращает 0, если диапазон 06-00. Я пытаюсь много вариантов, но просто не могу заставить его работать. Я надеялся, что можно определить недельность в моей функции.

Код Так что я начать с вызова этого метода внутри отборное:

Case When DATEPART(HOUR,t.Hour) = 1 THEN a.sumfunction ELSE NULL END as sumfunction 

Функция это сам выглядит следующим образом:

OUTER APPLY ( SELECT SUM(CASE WHEN DATEPART(HOUR, t2.Hour) BETWEEN 6 AND 23 THEN abs(t2.Price) ELSE 0 END) sumfunction FROM dbo.Values t2 where t2.Hour >= dateadd(hh,5,t.Hour - 1) AND t2.Hour <= dateadd(hh,-1,t.Hour) )a

Заявление BETWEEN 6 AND 23 дает правильную сумму с 06 до 23 часов, но изменение этого на интервал BETWEEN 6 AND 0 вернет 0. Я много работал с WHERE, но не может заставить эту работу работать.

Надеюсь, у вас есть идеи.

Спасибо!

(MS SQL 2008)

+0

Вы можете добавить другое условие ИЛИ DATEPART (...) = 0 –

ответ

0

Вы можете просто вычесть один час и выполнить сравнение в течение одного дня. Я считаю, что проще работать с datetime + int, а не dateadd() для этого типа операции:

OUTER APPLY 
(SELECT SUM(CASE WHEN DATEPART(HOUR, t2.Hour - 1.0/24) BETWEEN 5 AND 23 
       THEN abs(t2.Price) 
       ELSE 0 
      END) sumfunction 
FROM dbo.Values t2 
) 

Я совершенно непонятно, с целью пункта where, потому что ваш вопрос упоминает только одну таблицу. Однако вы, вероятно, можете применить к этому ту же логику.

0

причина BETWEEN 6 AND 0 возвращает ничего просто - из MSDN (Midnight values not included in SUM (MS SQL)):

МЕЖДУ возвращает TRUE, если значение test_expression больше или равно значению от start_expression и меньше или равно значению end_expression.

поскольку он не может быть больше 6 и в то же время меньше 0, это противоречие.

вместо этого вы можете использовать что-то вроде

x BETWEEN 6 AND 23 OR x == 0 

этом будет принимать во внимание также полночь.

Смежные вопросы