SQL Server 2012使用纪元时间分析上个月的数据

问题描述 投票:0回答:1

新手在这里......

我在SQL Server 2012数据库上报告上一个日历月的数据时遇到了挑战,但时间戳是由Epoch时间设置的。将我写的查询引用到上个月这是一个挑战。

任何帮助都会很棒。

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 

继续评论......这意味着作为月度任务运行(批处理文件脚本化的计划任务)。我用标准的日期/时间进行了类似的查询,但是用了一个时代的砖墙。

谢谢

sql sql-server timestamp epoch
1个回答
3
投票

所以datetime值存储为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的简写:

© www.soinside.com 2019 - 2024. All rights reserved.