本文目錄列表:1、準備測試數據2、向測試數據表添加相關時間粒度欄位列3、基於日月季年統計彙總的演示4、總結語5、參考清單列表準備測試數據為了提供不同時間粒度示例的演示,就需要測試數據。為了演示方便,本文提供一個測試數據表(登錄信息數據表----LoginInfo),以及改變插入測試數據。該測試數據表...
本文目錄列表: 1、準備測試數據 2、向測試數據表添加相關時間粒度欄位列 3、基於日月季年統計彙總的演示 4、總結語 5、參考清單列表 準備測試數據 為了提供不同時間粒度示例的演示,就需要測試數據。為了演示方便,本文提供一個測試數據表(登錄信息數據表----LoginInfo),以及改變插入測試數據。該測試數據表就是簡單記錄每個用戶每次的登路時間信息。 LoginInfo創建的腳本的T-SQL代碼如下: IF OBJECT_ID(N'dbo.LoginInfo', 'U') IS NOT NULL BEGIN DROP TABLE dbo.LoginInfo; END GO CREATE TABLE dbo.LoginInfo ( LoginInfoID INT IDENTITY(1, 1) NOT NULL, UserID INT NOT NULL, LoginTime DATETIME NOT NULL ); GO IF OBJECT_ID(N'PK_U_CL_LoginInfo_LoginInfoID', N'PK') IS NULL BEGIN ALTER TABLE [dbo].[LoginInfo] ADD CONSTRAINT [PK_U_CL_LoginInfo_LoginInfoID] PRIMARY KEY CLUSTERED ( [LoginInfoID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY]; END GO IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE object_id = OBJECT_ID(N'[dbo].[LoginInfo]', N'U') AND name = N'IX_U_NCL_LoginInfo_LoginTime_UserID') BEGIN CREATE NONCLUSTERED INDEX [IX_U_NCL_LoginInfo_LoginTime_UserID] ON [dbo].[LoginInfo] ( [LoginTime] ASC, [UserID] ASC ) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY]; END GO IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE object_id = OBJECT_ID(N'[dbo].[LoginInfo]', N'U') AND name = N'IX_NU_NCL_LoginInfo_UserID') BEGIN CREATE NONCLUSTERED INDEX [IX_NU_NCL_LoginInfo_UserID] ON [dbo].[LoginInfo] ( [UserID] ASC ) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY]; END GO 向LoginInfo數據表插入測試數據的T-SQL腳本如下: -- 方法1、 模擬100個用戶在2015年登陸時間的信息記錄 TRUNCATE TABLE dbo.LoginInfo; GO DECLARE @intUserTotal AS INT, @dtmStartDateTime AS DATETIME, @dtmEndDateTime AS DATETIME; SELECT @intUserTotal = 100, @dtmStartDateTime = '2015-01-01', @dtmEndDateTime = '2015-12-31'; -- 插入數據 INSERT INTO dbo.LoginInfo ( UserID ,LoginTime ) SELECT T.Num AS UserID ,T2.LoginTime FROM dbo.ufn_GetNums(1, @intUserTotal) AS T CROSS APPLY ( SELECT CONVERT(DATETIME, CONVERT(VARCHAR(14), DATEADD(HOUR, Num * 4, @dtmStartDateTime), 120) + CAST(dbo.ufn_RandNum(0,59) AS VARCHAR(2)) + ':'+ CAST(dbo.ufn_RandNum(0,59) AS VARCHAR(2)) + '.'+ CAST(dbo.ufn_RandNum(0,997) AS VARCHAR(3)), 120) AS LoginTime FROM dbo.ufn_GetNums(0, DATEDIFF(HOUR, @dtmStartDateTime, @dtmEndDateTime) / 4) ) AS T2 ORDER BY T2.LoginTime ASC, T.Num ASC; GO -- 方法2、 模擬1000個用戶在2015年登陸時間的信息記錄 TRUNCATE TABLE dbo.LoginInfo; GO DECLARE @intUserTotal AS INT, @dtmStartDateTime AS DATETIME, @dtmEndDateTime AS DATETIME; SELECT @intUserTotal = 1000, @dtmStartDateTime = '2015-01-01', @dtmEndDateTime = '2015-12-31'; SELECT T.Num AS UserID ,T2.LoginTime FROM dbo.ufn_GetNums(1, @intUserTotal) AS T CROSS APPLY ( SELECT CONVERT(DATETIME, CONVERT(VARCHAR(14), DATEADD(HOUR, Num * 4, @dtmStartDateTime), 120) + CAST(dbo.ufn_RandNum(0,59) AS VARCHAR(2)) + ':'+ CAST(dbo.ufn_RandNum(0,59) AS VARCHAR(2)) + '.'+ CAST(dbo.ufn_RandNum(0,997) AS VARCHAR(3)), 120) AS LoginTime FROM dbo.ufn_GetNums(0, DATEDIFF(HOUR, @dtmStartDateTime, @dtmEndDateTime) / 4) ) AS T2; GO 註意: 1、以上填充測試數據提供了兩個方法:一個是模擬100個用戶的小數據,另一個是模擬1000個用戶的稍大數據,時間段都是2015年的登錄時間。 2、本文為了演示的方便採用了模擬100個用戶的小數據。 3、填充測試數據使用了函數ufn_GetNums,請參考SQL Server數字輔助表的實現。 查看測試數據表中的數據,如下圖:
![](http://images2015.cnblogs.com/blog/82100/201601/82100-20160119154115718-1924048638.png)
![](file:///C:/Users/dingzhiyou/AppData/Local/YNote/data/dzy863@163.com/805b59e5aac943e0896ddd3105b7ef73/clipboard.png)
![](http://images2015.cnblogs.com/blog/82100/201601/82100-20160119154136484-1774308777.png)
![](file:///C:/Users/dingzhiyou/AppData/Local/YNote/data/dzy863@163.com/a65d81caba814b288a16e088f1ac9b9b/clipboard.png)
![](file:///C:/Users/dingzhiyou/AppData/Local/YNote/data/dzy863@163.com/2cd8f3429ab44e8bad2660e9c11c6422/clipboard.png)
![](http://images2015.cnblogs.com/blog/82100/201601/82100-20160119154159453-1389479214.png)
![](http://images2015.cnblogs.com/blog/82100/201601/82100-20160119154253437-1360087242.png)
![](file:///C:/Users/dingzhiyou/AppData/Local/YNote/data/dzy863@163.com/dc771d6312024f9999066e6fdd107254/clipboard.png)
![](file:///C:/Users/dingzhiyou/AppData/Local/YNote/data/dzy863@163.com/7c5384863b184ac197d852811a8ffee3/clipboard.png)
![](http://images2015.cnblogs.com/blog/82100/201601/82100-20160119154307234-806973421.png)
![](file:///C:/Users/dingzhiyou/AppData/Local/YNote/data/dzy863@163.com/eda1a5108117410b8aa23bcd0f945abb/clipboard.png)
![](http://images2015.cnblogs.com/blog/82100/201601/82100-20160119154320265-657817739.png)
![](file:///C:/Users/dingzhiyou/AppData/Local/YNote/data/dzy863@163.com/d6048b86088c428181ced5fd238a936e/clipboard.png)
![](http://images2015.cnblogs.com/blog/82100/201601/82100-20160119154339047-982637665.png)
2、SQL Server時間粒度系列----第7節日曆數據表詳解。