SQL时间戳减法以获取天数
在下面的代码中,我需要用开放时间和当前时间进行计算,而不是活动年龄 换句话说,如果当前时间减去开放时间在0到30之间,或者31到60之间,或者超过60,我需要这样做SQL时间戳减法以获取天数,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,在下面的代码中,我需要用开放时间和当前时间进行计算,而不是活动年龄 换句话说,如果当前时间减去开放时间在0到30之间,或者31到60之间,或者超过60,我需要这样做 SELECT COUNT(CASE WHEN Assignment = 'Crosby' AND Severity = 4 AND CloseTime-OpenTime = 0-30 THEN P_NUMBER END) as crosby_sev4_030, COUNT(CASE WHEN Assignmen
SELECT COUNT(CASE WHEN Assignment = 'Crosby' AND Severity = 4 AND CloseTime-OpenTime = 0-30 THEN P_NUMBER END) as crosby_sev4_030,
COUNT(CASE WHEN Assignment = 'Crosby' AND Severity = 5 AND Active_Age='0-30' THEN P_NUMBER END) as crosby_sev5_030,
COUNT(CASE WHEN Assignment = 'Crosby' AND Severity = 4 AND Active_Age='31-60' THEN P_NUMBER END) as crosby_sev4_3160,
COUNT(CASE WHEN Assignment = 'Crosby' AND Severity = 5 AND Active_Age='31-60' THEN P_NUMBER END) as crosby_sev5_3160,
COUNT(CASE WHEN Assignment = 'Crosby' AND Severity = 4 AND Active_Age='60+' THEN P_NUMBER END) as crosby_sev4_60,
COUNT(CASE WHEN Assignment = 'Crosby' AND Severity = 5 AND Active_Age='60+' THEN P_NUMBER END) as crosby_sev5_60
FROM dashboard.dbo.SmThings
WHERE Assignment IN('Crosby')
AND Severity IN(4,5)
如果您使用的是MSSQL-请使用 输出将是 DiffDate
61 datediff
SELECT
COUNT(CASE WHEN Assignment = 'Crosby' AND Severity = 4 AND datediff('day',getdate(), OpenTime) between 0 and 30 THEN P_NUMBER END) as crosby_sev4_030,
COUNT(CASE WHEN Assignment = 'Crosby' AND Severity = 5 AND datediff('day',getdate(), OpenTime between 0 and 30 THEN P_NUMBER END) as crosby_sev5_030,
COUNT(CASE WHEN Assignment = 'Crosby' AND Severity = 4 AND datediff('day',getdate(), OpenTime between 31 and 60 THEN P_NUMBER END) as crosby_sev4_3160,
COUNT(CASE WHEN Assignment = 'Crosby' AND Severity = 5 AND datediff('day',getdate(), OpenTime between 31 and 30 THEN P_NUMBER END) as crosby_sev5_3160,
COUNT(CASE WHEN Assignment = 'Crosby' AND Severity = 4 AND datediff('day',getdate(), OpenTime > 60 THEN P_NUMBER END) as crosby_sev4_60,
COUNT(CASE WHEN Assignment = 'Crosby' AND Severity = 5 AND datediff('day',getdate(), OpenTime > 60 THEN P_NUMBER END) as crosby_sev5_60
FROM dashboard.dbo.SmThings
WHERE Assignment IN('Crosby')
AND Severity IN(4,5)
这个怎么样
WITH Assignments AS (
SELECT
Grp = Assignment + '_Sev' + Convert(varchar(11), Severity) + '_' + Label
FROM
dashboard.dbo.SmThings
CROSS APPLY (
SELECT Age = DateDiff(OpenTime, GetDate())
) A
INNER JOIN (
SELECT '030', 0, 30, '030'
UNION ALL SELECT '3160', 31, 59 -- notice 59 here!
UNION ALL SELECT '60', 60, 2147483647
) X (Label, Low, High)
ON A.Age BETWEEN X.Low AND X.High
WHERE Assignment IN ('Crosby')
AND Severity IN (4, 5)
)
SELECT
Grp,
Value = Count(*)
INTO #Data
FROM
Assignments
GROUP BY
Grp
;
然后,您可以自动使用这些生成的值来透视(需要SQL Server 2005或更高版本):
看着魔法发生!(假设我没有犯任何错误,这不太可能。)我如何使用当前日期而不是2008-08-05?我还需要它像“和DATEDIFF(day,'open_time,'current_date')=0-31或31-60或60+”,虽然这有一个逻辑问题,因为你可能有超过30和<31的日期,这不会显示在计数中,但你原来的帖子也有这个问题。这可能可以通过舍入datediff来解决,但我不知道您是要舍入还是截断。请稍候,不是关闭时间,而是当前时间。
WITH Assignments AS (
SELECT
Grp = Assignment + '_Sev' + Convert(varchar(11), Severity) + '_' + Label
FROM
dashboard.dbo.SmThings
CROSS APPLY (
SELECT Age = DateDiff(OpenTime, GetDate())
) A
INNER JOIN (
SELECT '030', 0, 30, '030'
UNION ALL SELECT '3160', 31, 59 -- notice 59 here!
UNION ALL SELECT '60', 60, 2147483647
) X (Label, Low, High)
ON A.Age BETWEEN X.Low AND X.High
WHERE Assignment IN ('Crosby')
AND Severity IN (4, 5)
)
SELECT
Grp,
Value = Count(*)
INTO #Data
FROM
Assignments
GROUP BY
Grp
;
DECLARE @SQL nvarchar(max);
SET @SQL = '
SELECT *
FROM
#Data
PIVOT (Max(Value) FOR Grp IN ('
+ Stuff(
(SELECT ', ' + Convert(nvarchar(max), QuoteName(Grp))
FROM #Data FOR XML PATH(''), TYPE).value('.[1]', 'nvarchar(max)'),
1, 2, 0
) + ')) P
';
EXEC (@SQL);