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
  • 相关阅读:
    ntp时钟同步
    Office2013中文激活版
    Windows2008|2003超出最大连接数
    Vivaldi浏览器媲美Chrome
    Win10激活KMS2.0
    FTP下载工具
    UltraEdit编辑器|UE
    社工-入侵
    实时系统跟分时系统
    ThreadPoolExecutor线程池解析与BlockingQueue的三种实现
  • 原文地址:https://www.cnblogs.com/insus/p/11025759.html
Copyright © 2011-2022 走看看