Вставьте Даты в возврат из запроса, где нет ни одного

Вы не создаете экземпляр класса. DummyComponent представляет сам класс, когда используется в выражении, а не в экземпляре класса. Для создания экземпляра класса вам нужно использовать оператор new:

class Component {
    assertBoolean(): boolean {
    return true;
    }
}

class DummyComponent extends Component {
}

const components: Component[] = [ new DummyComponent() ];

Чтобы сохранить массив классов, вам необходимо использовать typeof Component. Это представляет тип класса (не экземпляр класса)

const components: (typeof Component)[] = [DummyComponent];
new components[0]()
8
задан pilcrow 10 September 2012 в 04:31
поделиться

5 ответов

Вы собираетесь так или иначе нуждаться в таблице дней и часов, и затем необходимо будет сделать внешнее объединение между той таблицей и запросом. Вот то, как я сделал бы это. Обратите внимание, что это решение будет только работать в SQL Server 2005 и 2008. Если у Вас нет тех платформ, необходимо будет на самом деле составить таблицу времен в базе данных, от которой можно присоединиться прочь:

DECLARE @MinDate DATETIME;
SET @MinDate =  CONVERT(varchar, GETDATE(), 101);

WITH times AS (
    SELECT @MinDate as dt, 1 as depth
    UNION ALL
    SELECT DATEADD(hh, depth, @MinDate), 1 + depth as depth
    FROM times
    WHERE DATEADD(hh, depth, @MinDate) <= GETDATE())
SELECT DATEPART(YEAR, t.dt) as [Year],
    DATEPART(MONTH, t.dt) as [Month],
    DATEPART(DAY, t.dt) as [Day],
    DATEPART(HOUR, t.dt) as [Hour],
    COUNT(tdm_msg) as Total_ACTIVITES
FROM times t
LEFT JOIN (SELECT * FROM TCKT_ACT WHERE tdm_msg = '4162' and dev_time >= @MinDate) a
    ON  DATEPART(HOUR, t.dt)  = DATEPART(HOUR, a.dev_time)
    AND MONTH(t.dt) = MONTH(a.dev_time)
    AND DAY(t.dt)   = DAY(a.dev_time)
    AND YEAR(t.dt)  = YEAR(a.dev_time)
GROUP BY DATEPART(YEAR, t.dt) ,
    DATEPART(MONTH, t.dt) ,
    DATEPART(DAY, t.dt),
    DATEPART(HOUR, t.dt)
ORDER BY DATEPART(YEAR, t.dt) asc,
    DATEPART(MONTH, t.dt) asc,
    DATEPART(DAY, t.dt) asc,
    DATEPART(HOUR, t.dt) asc
OPTION (MAXRECURSION 0); /* Just in case you want a longer timespan later on... */

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

3
ответ дан 5 December 2019 в 20:20
поделиться

Сначала я создал функцию таблицы на основе рекурсивного общего запроса таблицы, описанного Dave Markle (благодарит показать мне этого Dave!). Это чрезвычайно сладко, потому что я только должен сделать функцию однажды, и я могу использовать ее для анализа любых интервалов.

if exists (select * from dbo.sysobjects where name = 'fn_daterange') drop function fn_daterange;
go

create function fn_daterange
   (
   @MinDate as datetime,
   @MaxDate as datetime,
   @intval  as datetime
   )
returns table
--**************************************************************************
-- Procedure: fn_daterange()
--    Author: Ron Savage
--      Date: 12/16/2008
--
-- Description:
-- This function takes a starting and ending date and an interval, then
-- returns a table of all the dates in that range at the specified interval.
--
-- Change History:
-- Date        Init. Description
-- 12/16/2008  RS    Created.
-- **************************************************************************
as
return
   WITH times (startdate, enddate, intervl) AS
      (
      SELECT @MinDate as startdate, @MinDate + @intval - .0000001 as enddate, @intval as intervl
         UNION ALL
      SELECT startdate + intervl as startdate, enddate + intervl as enddate, intervl as intervl
      FROM times
      WHERE startdate + intervl <= @MaxDate
      )
   select startdate, enddate from times;

go

Таким образом, если Вы делаете выбор из той функции совершенно отдельно, Вы получаете таблицу временных интервалов как это:

fn_daterange ('14.12.2008 10:00:00', '14.12.2008 20:00:00', '1:00:00')

возвраты:

startdate               enddate                 intervl                 
----------------------- ----------------------- ----------------------- 
2008-12-14 10:00:00.000 2008-12-14 10:59:59.997 1900-01-01 01:00:00.000 
2008-12-14 11:00:00.000 2008-12-14 11:59:59.997 1900-01-01 01:00:00.000 
2008-12-14 12:00:00.000 2008-12-14 12:59:59.997 1900-01-01 01:00:00.000 
2008-12-14 13:00:00.000 2008-12-14 13:59:59.997 1900-01-01 01:00:00.000 
2008-12-14 14:00:00.000 2008-12-14 14:59:59.997 1900-01-01 01:00:00.000 
2008-12-14 15:00:00.000 2008-12-14 15:59:59.997 1900-01-01 01:00:00.000 
2008-12-14 16:00:00.000 2008-12-14 16:59:59.997 1900-01-01 01:00:00.000 
2008-12-14 17:00:00.000 2008-12-14 17:59:59.997 1900-01-01 01:00:00.000 
2008-12-14 18:00:00.000 2008-12-14 18:59:59.997 1900-01-01 01:00:00.000 
2008-12-14 19:00:00.000 2008-12-14 19:59:59.997 1900-01-01 01:00:00.000 
2008-12-14 20:00:00.000 2008-12-14 20:59:59.997 1900-01-01 01:00:00.000 

Затем я сделал демонстрационную таблицу данных о событии:

    eventdate               eventnote            
    ----------------------- -------------------- 
    2008-12-14 10:01:00.000 oo! an event!        
    2008-12-14 10:01:00.000 oo! an event!        
    2008-12-14 10:01:00.000 oo! an event!        
    2008-12-14 10:01:00.000 oo! an event!        
    2008-12-14 10:23:00.000 oo! an event!        
    2008-12-14 10:23:00.000 oo! an event!        
    2008-12-14 10:23:00.000 oo! an event!        
    2008-12-14 11:23:00.000 oo! an event!        
    2008-12-14 11:23:00.000 oo! an event!        
    2008-12-14 11:23:00.000 oo! an event!        
    2008-12-14 11:23:00.000 oo! an event!        
    2008-12-14 11:23:00.000 oo! an event!        
    2008-12-14 14:23:00.000 oo! an event!        
    2008-12-14 14:23:00.000 oo! an event!        
    2008-12-14 14:23:00.000 oo! an event!        
    2008-12-14 19:23:00.000 oo! an event!        
    2008-12-14 19:23:00.000 oo! an event!        
    2008-12-14 19:23:00.000 oo! an event!        
    2008-12-14 19:23:00.000 oo! an event!        
    2008-12-14 19:00:00.000 oo! an event!        
    2008-12-14 19:00:00.000 oo! an event!        
    2008-12-14 19:00:00.000 oo! an event!        

    22 Row(s) affected

Затем я сцепил их вместе с ЛЕВЫМ ВНЕШНИМ ОБЪЕДИНЕНИЕМ как так:

select
   dr.startdate,
   dr.enddate,
   count(me.eventdate) as eventcount
from
   fn_daterange('12/14/2008 10:00:00', '12/14/2008 20:00:00', '01:00:00' ) dr

   LEFT OUTER JOIN myevents me
      on ( me.eventdate between dr.startdate and dr.enddate)
group by
   dr.startdate,
   dr.enddate


startdate               enddate                 eventcount 
----------------------- ----------------------- ---------- 
2008-12-14 10:00:00.000 2008-12-14 10:59:59.993 7          
2008-12-14 11:00:00.000 2008-12-14 11:59:59.993 5          
2008-12-14 12:00:00.000 2008-12-14 12:59:59.993 0          
2008-12-14 13:00:00.000 2008-12-14 13:59:59.993 0          
2008-12-14 14:00:00.000 2008-12-14 14:59:59.993 3          
2008-12-14 15:00:00.000 2008-12-14 15:59:59.993 0          
2008-12-14 16:00:00.000 2008-12-14 16:59:59.993 0          
2008-12-14 17:00:00.000 2008-12-14 17:59:59.993 0          
2008-12-14 18:00:00.000 2008-12-14 18:59:59.993 0          
2008-12-14 19:00:00.000 2008-12-14 19:59:59.993 7          
2008-12-14 20:00:00.000 2008-12-14 20:59:59.993 0          

11 Row(s) affected

СВЯТОЕ ДЕРЬМО, которое сладко - я могу использовать это для всех видов анализа на работе!:-)

Спасибо Fred для вопроса и Dave для получения информации об общих запросах таблицы!

Ron

3
ответ дан 5 December 2019 в 20:20
поделиться

Это кажется, что Вы могли использовать "левое внешнее объединение", использующее другую таблицу, которая имеет номера 1 - 24 в нем...

0
ответ дан 5 December 2019 в 20:20
поделиться

У нас была подобная проблема с некоторым контрольным программным обеспечением производительности, но, будучи в мейнфреймовом магазине DB2/z, мы - тупик против необходимости сделать гимнастику SQL для получения подобных результатов. SQL-запросы, которые выполняют 'функции' на каждой строке, которую они получают, известно неприступны, и DBAs имел бы повод повеселиться, смеющийся над нами, если бы мы пытались использовать их.

Вместо этого мы нашли легче осуществить рефакторинг схему базы данных для включения количества событий в каждой строке (по-видимому, наши DBAs не возражают использовать больше дискового пространства, просто больше пехотинца ЦП). В Вашем случае, который добавил бы названный столбец tdm_quant который Вы установили бы на 1 для каждой строки, которую Вы вставляете (т.е. каждое событие).

Затем пятое поле Вашего запроса изменяется от count(tdm_msg) кому: sum(tdm_quant) который достигнет того же результата.

В дополнение к этому можно вставить специальную запись (раз в час, или 24 из них в начале каждого дня, или заполнить всю ценность лет 1 января, если Вы желаете), где tdm_quant поле обнуляется. Будучи нулем, эти записи не будут иметь никакого эффекта на sum(tdm_quant) но Вы получите свое желаемое поведение, строка, возвращенная в течение каждого часа дня, который будет иметь нуль как Total_ACTIVITIES где никакие события не имели место в тот час.

Остальная часть Вашего запроса не должна будет изменяться.

2
ответ дан 5 December 2019 в 20:20
поделиться

Основной ответ здесь включает оставленное внешнее объединение (LOJ) и явное COUNT(column) так как это не рассчитывает, аннулирует, но КОЛИЧЕСТВО (*) считает все строки. Твердая часть генерирует таблицу, против которой можно сделать LOJ. С пунктом и рекурсивным решением будет работать во многом DBMS (SQL Server MS, по-видимому, и почти наверняка DB2 - вероятно, другие также).

Много временных таблиц поддержки DBMS и хранимых процедур; комбинация могла использоваться, чтобы заполнить таблицу с соответствующим множеством значений для поля даты/времени и затем сделать LOJ против той таблицы (или, более точно, ОТ temp_table, ОСТАВЛЕННОГО ВНЕШНЕЕ ОБЪЕДИНЕНИЕ main_table...). Не как аккуратный и опрятный, но работы большинство мест.

0
ответ дан 5 December 2019 в 20:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: