DATEDIFF 函数语法如下DATEDIFF ( datepart , startdate , enddate ),返回指定的 startdate 和 enddate 之间所跨的指定 datepart 边界的计数(带符号的整数)。下面来说说我碰到的这个问题。用户表里user里面有个字段Create_Time记录用户注册日期,Last_Login_Time 记录用户最后登录的时间,要统计注册用户在注册后,按注册日期统计第一天、第二天、第三天......第七天,七天以后登录人数。用来了解注册用户的回流信息。
DECLARE @cmdText VARCHAR(8000);
DECLARE @userIndex INT;
SET @cmdText = '';
SET @userIndex = 0;
WHILE @userIndex <30
BEGIN
IF (@userIndex != 29)
SELECT @cmdText = @cmdText +
'SELECT CONVERT(VARCHAR(10), Create_Time, 120) AS Create_Time,
DATEDIFF(D, Create_Time, Last_Login_Time) LoginDay
FROM ' + ' dbo.user' + CONVERT(VARCHAR,@userIndex)
+ ' UNION ALL' + CHAR(10); --换行
ELSE
SELECT @cmdText = @cmdText +
'SELECT CONVERT(VARCHAR(10), Create_Time, 120) AS Create_Time,
DATEDIFF(D, Create_Time, Last_Login_Time) LoginDay
FROM ' + ' dbo.user' + CONVERT(VARCHAR,@userIndex) ;
SET @userIndex = @userIndex + 1;
END;
SELECT @cmdText =
'SELECT U.Create_Time,SUM(RegisterNum) AS RegisterNum,
SUM(FirstDay) AS FirstDay, SUM(TwoDay) AS TwoDay,
SUM(ThirdDay) AS ThirdDay, SUM(FourDay) AS FourDay,
SUM(FiveDay) AS FiveDay,SUM(SixDay) AS SixDay,
SUM(SevenDay) AS SevenDay, SUM(Others) AS Others
FROM (
SELECT Create_Time, COUNT(Create_Time) AS RegisterNum,
CASE WHEN LoginDay = 0 THEN COUNT(Create_Time) ELSE 0 END AS FirstDay,
CASE WHEN LoginDay = 1 THEN COUNT(Create_Time) ELSE 0 END AS TwoDay,
CASE WHEN LoginDay = 2 THEN COUNT(Create_Time) ELSE 0 END AS ThirdDay,
CASE WHEN LoginDay = 3 THEN COUNT(Create_Time) ELSE 0 END AS FourDay,
CASE WHEN LoginDay = 4 THEN COUNT(Create_Time) ELSE 0 END AS FiveDay,
CASE WHEN LoginDay = 5 THEN COUNT(Create_Time) ELSE 0 END AS SixDay,
CASE WHEN LoginDay = 6 THEN COUNT(Create_Time) ELSE 0 END AS SevenDay,
CASE WHEN LoginDay > 6 THEN COUNT(Create_Time) ELSE 0 END AS Others
FROM
(
SELECT T.Create_Time, T.LoginDay
FROM
('
+ @cmdText +
') T
) TT
GROUP BY TT.Create_Time, TT.LoginDay
) U
GROUP BY U.Create_Time
ORDER BY U.Create_Time';
--PRINT @cmdText
EXEC (@cmdText);
DECLARE @userIndex INT;
SET @cmdText = '';
SET @userIndex = 0;
WHILE @userIndex <30
BEGIN
IF (@userIndex != 29)
SELECT @cmdText = @cmdText +
'SELECT CONVERT(VARCHAR(10), Create_Time, 120) AS Create_Time,
DATEDIFF(D, Create_Time, Last_Login_Time) LoginDay
FROM ' + ' dbo.user' + CONVERT(VARCHAR,@userIndex)
+ ' UNION ALL' + CHAR(10); --换行
ELSE
SELECT @cmdText = @cmdText +
'SELECT CONVERT(VARCHAR(10), Create_Time, 120) AS Create_Time,
DATEDIFF(D, Create_Time, Last_Login_Time) LoginDay
FROM ' + ' dbo.user' + CONVERT(VARCHAR,@userIndex) ;
SET @userIndex = @userIndex + 1;
END;
SELECT @cmdText =
'SELECT U.Create_Time,SUM(RegisterNum) AS RegisterNum,
SUM(FirstDay) AS FirstDay, SUM(TwoDay) AS TwoDay,
SUM(ThirdDay) AS ThirdDay, SUM(FourDay) AS FourDay,
SUM(FiveDay) AS FiveDay,SUM(SixDay) AS SixDay,
SUM(SevenDay) AS SevenDay, SUM(Others) AS Others
FROM (
SELECT Create_Time, COUNT(Create_Time) AS RegisterNum,
CASE WHEN LoginDay = 0 THEN COUNT(Create_Time) ELSE 0 END AS FirstDay,
CASE WHEN LoginDay = 1 THEN COUNT(Create_Time) ELSE 0 END AS TwoDay,
CASE WHEN LoginDay = 2 THEN COUNT(Create_Time) ELSE 0 END AS ThirdDay,
CASE WHEN LoginDay = 3 THEN COUNT(Create_Time) ELSE 0 END AS FourDay,
CASE WHEN LoginDay = 4 THEN COUNT(Create_Time) ELSE 0 END AS FiveDay,
CASE WHEN LoginDay = 5 THEN COUNT(Create_Time) ELSE 0 END AS SixDay,
CASE WHEN LoginDay = 6 THEN COUNT(Create_Time) ELSE 0 END AS SevenDay,
CASE WHEN LoginDay > 6 THEN COUNT(Create_Time) ELSE 0 END AS Others
FROM
(
SELECT T.Create_Time, T.LoginDay
FROM
('
+ @cmdText +
') T
) TT
GROUP BY TT.Create_Time, TT.LoginDay
) U
GROUP BY U.Create_Time
ORDER BY U.Create_Time';
--PRINT @cmdText
EXEC (@cmdText);