新手在这里......
我在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
继续评论......这意味着作为月度任务运行(批处理文件脚本化的计划任务)。我用标准的日期/时间进行了类似的查询,但是用了一个时代的砖墙。
谢谢
所以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
的简写: