如何产生连续时间?(案例)
原问题如下:
Insus.NET的问题解决,分2步,1,创建一个辅助表,2,合并数据。
程式码搜寻出来如图:
IF OBJECT_ID(N'TEMPDB.DBO.#search_data') IS NOT NULL DROP TABLE #search_data GO CREATE TABLE #search_data ([times] DATETIME,[val] INT) INSERT INTO #search_data ([times],[val]) VALUES ('2001-01-01 00:00:00',13), ('2001-01-01 00:10:00',22), ('2001-01-01 00:20:00',31), ('2001-01-01 00:40:00',5 ), ('2001-01-01 00:50:00',64), ('2001-01-01 02:30:00',73), ('2001-01-01 04:10:00',63), ('2001-01-01 04:50:00',12), ('2001-01-01 06:30:00',32)
接下来,我们可以创建一张辅助表:
DECLARE @start_datetime DATETIME = '2000-01-01 00:00:00', @end_datetime DATETIME = '2000-02-01 00:00:00' ;WITH DTs([times]) AS ( SELECT @start_datetime UNION ALL SELECT [times] = DATEADD(MINUTE,10, [times]) FROM [DTs] WHERE [times] < @end_datetime ) SELECT [times] FROM [DTs] OPTION (MaxRecursion 0)
总共产生4465行记录。
更多相关辅助表,可以参考《使用CTE生成辅助表(数字或时间)等》https://www.cnblogs.com/insus/p/10946112.html 和《快速生成基数的辅助表》https://www.cnblogs.com/insus/p/10946112.html
为了更好操作,把辅助表的产生数据存入一张临时表中:
IF OBJECT_ID(N'TEMPDB.DBO.#base') IS NOT NULL DROP TABLE #base GO CREATE TABLE #base ([times] DATETIME) DECLARE @start_datetime DATETIME = '2000-01-01 00:00:00', @end_datetime DATETIME = '2000-02-01 00:00:00' ;WITH DTs([times]) AS ( SELECT @start_datetime UNION ALL SELECT [times] = DATEADD(MINUTE,10, [times]) FROM [DTs] WHERE [times] < @end_datetime ) INSERT INTO #base ([times]) SELECT [times] FROM [DTs] OPTION (MaxRecursion 0)
第2步,合并数据,把程序搜索结果与辅助表的数据进行合并merge:
MERGE #search_data AS Target USING (SELECT [times] FROM #base) AS Source ON (Target.[times] = Source.[times]) WHEN NOT MATCHED BY TARGET THEN INSERT ([times],[val]) VALUES ([times],0); SELECT [times],[val] FROM #search_data
OK,实现方法仅供参考,完整代码:
IF OBJECT_ID(N'TEMPDB.DBO.#search_data') IS NOT NULL DROP TABLE #search_data GO CREATE TABLE #search_data ([times] DATETIME,[val] INT) INSERT INTO #search_data ([times],[val]) VALUES ('2001-01-01 00:00:00',13), ('2001-01-01 00:10:00',22), ('2001-01-01 00:20:00',31), ('2001-01-01 00:40:00',5 ), ('2001-01-01 00:50:00',64), ('2001-01-01 02:30:00',73), ('2001-01-01 04:10:00',63), ('2001-01-01 04:50:00',12), ('2001-01-01 06:30:00',32) IF OBJECT_ID(N'TEMPDB.DBO.#base') IS NOT NULL DROP TABLE #base GO CREATE TABLE #base ([times] DATETIME) DECLARE @start_datetime DATETIME = '2000-01-01 00:00:00', @end_datetime DATETIME = '2000-02-01 00:00:00' ;WITH DTs([times]) AS ( SELECT @start_datetime UNION ALL SELECT [times] = DATEADD(MINUTE,10, [times]) FROM [DTs] WHERE [times] < @end_datetime ) INSERT INTO #base ([times]) SELECT [times] FROM [DTs] OPTION (MaxRecursion 0) MERGE #search_data AS Target USING (SELECT [times] FROM #base) AS Source ON (Target.[times] = Source.[times]) WHEN NOT MATCHED BY TARGET THEN INSERT ([times],[val]) VALUES ([times],0); SELECT [times],[val] FROM #search_data
正文到此结束