zoukankan      html  css  js  c++  java
  • 如何产生连续时间?(案例)

    原问题如下:

    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)
     
    Source Code

    接下来,我们可以创建一张辅助表:

     

    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)
    Source Code

    总共产生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)
    Source Code

    第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
    Source Code

    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
    Source Code
  • 相关阅读:
    LinkedList类源码浅析(一)
    ArrayList类源码浅析(三)
    我谁也没等,因为谁也不会来
    维持一段友谊
    最甜美的悲伤
    小美人访谈录笔记[1]
    1984我想对这个世界说些什么
    我喜欢我
    等不来的始终等不来,无须报以希望
    我抱有怀疑
  • 原文地址:https://www.cnblogs.com/insus/p/11025759.html
Copyright © 2011-2022 走看看