SQL Server 2012 анализирует данные за предыдущий месяц со временем эпохи - PullRequest
0 голосов
/ 18 февраля 2019

Новичок здесь ...

Мне поставили задачу сообщить данные за предыдущий календарный месяц в базе данных SQL Server 2012, но отметки времени устанавливаются по времени эпохи.Это немного сложная задача - отослать запрос, который я написал, к предыдущему месяцу.

Любая помощь была бы отличной.

DECLARE @fromDate AS DATETIME 
DECLARE @toDate AS DATETIME 

SET @fromDate = DATEADD(DAY, -1, CONVERT(SMALLDATETIME, CONVERT(DATE, GETDATE()))) 
SET @toDate = DATEADD(DAY, 0, CONVERT(SMALLDATETIME, CONVERT(DATE, GETDATE())));

SELECT 
    DATEADD(mi, DATEDIFF(mi, 0, cm.CREATE_DATE)/30*30,0) 'HALF_HOUR' , 
    COUNT(DISTINCT cm.ACTIVITY_1D) 'ACTIVITY_COUNT' , 
    SUM(cm. EVENT_DURATION) AS AGENT_EVENT_TIME,
    CASE 
       WHEN SUM(cm.EVENT_DURATION) <== 1800 
          THEN 1 
          ELSE CEILING (SUM(cm.EVENT_DURATION)*1.0/1800) 
    END AS AVG_CONCURRENCY, 
    u.USER NAME 
FROM 
    [dbo].[EGPL_EVENT_HISTORY_CASe_MGMT] cm
JOIN 
    EGPL USER u ON u.USER ID = cm.USER ID 
WHERE 
    cm. CREATE_DATE BETWEEN @fromDate AND @toDate 
    AND USER NAME  != ' system ' 
GROUP BY 
    DATEADD(mi, DATEDIFF(mi, 0, cm.CREATE_DATE) / 30 * 30, 0), u.USER_NAME
ORDER BY 
    1, 3 

В дополнение к комментариям ... это должно выполняться как ежемесячное задание (пакетное задание по расписанию).я выполнил аналогичные запросы со стандартной датой / временем, но ударил кирпичную стену эпохой.

Спасибо

1 Ответ

0 голосов
/ 18 февраля 2019

Таким образом, значения даты и времени хранятся как int и представляют количество секунд с 1970-01-01?Вы хотите превратить аргументы / параметры в типы, представленные в таблице, а не наоборот, особенно если этот столбец имеет индекс.Предполагается, что вам нужен месяц за раз, но его легко настроить для любого диапазона:

DECLARE @month datetime = '20190101'; -- don't use regional formats

DECLARE @start int, @end int;
SELECT @start = DATEDIFF(SECOND, '19700101', @month);
SET @end = DATEDIFF(SECOND, '19700101', DATEADD(MONTH, 1, @month));

SELECT ... FROM [dbo].[EGPL_EVENT_HISTORY_CASe_MGMT] AS cm
  WHERE cm.CREATE_DATE >= @start 
    AND cm.CREATE_DATE <  @end;

Если вы хотите, чтобы эта вещь делала «этот месяц» или «последний месяц» без указания,логика на самом деле не меняется.

В этом месяце:

DECLARE @month datetime = DATEFROMPARTS(YEAR(GETDATE()),MONTH(GETDATE()),1);
-- everything else the same

В прошлом месяце:

DECLARE @month datetime = DATEADD(MONTH, -1, 
  DATEADD(DAY,1-DAY(GETDATE()),CONVERT(date, GETDATE())));
-- everything else the same

И почему вы действительно не хотите использовать BETWEEN, региональные форматы и сокращение для даты / времени и ORDER BY:

...