需要通过临时表中的 ID 更新存储过程中的行

2024-01-11

我试图在表中获取描述中断的行,并通过计算的时间范围将它们分成单独的行,然后插入到另一个表中,以描述每个给定范围内的每小时时间段。

下面的代码为我们提供了以下输出:

我们从这一行(原始数据)开始:

OutageDate        StartTime                 EndTime             Duration
2010-11-10  16:00:00.0000000    17:30:00.0000000    90

在我运行存储过程之后(这是所需的输出!我只需要知道如何将其保存到表中):

OutageDate   StartHour StartMinutes  EndHour EndMinutes    StartTime        EndTime       Duration
2010-11-10  16   0       17       0        16:00:00.0000000     17:30:00.0000000    90
2010-11-10  17  30       18       0        16:00:00.0000000     17:30:00.0000000    90

以下是我需要弄清楚如何在我将行拆分为我想要的时间值后保存到表中的代码。我无法控制为什么会发生这种情况,它只需要按照比我更高的人的请求并由他们以这种格式指定:

--First, let's look at the original data in the table...just one row will do

SELECT TOP (1) *
  FROM actualTable
  ORDER BY OutageDate ASC

--Begin sproc logic
declare @OutageDate date
declare @StartTime time(7)
declare @EndTime time(7)
declare @StartHour bigint
declare @EndHour int
declare @StartMinute int
declare @EndMinute int
declare @Duration int

declare @Temp_StartTime time
declare @Temp_EndTime time
declare @temp_StartHour int
declare @temp_EndHour int
declare @temp_StartMinute int
declare @temp_EndMinute int


SELECT TOP(1) @OutageDate = OutageDate, @StartTime = StartTime, @EndTime = EndTime, @Duration = Duration FROM actualTable


SET @Temp_StartTime=@StartTime
SET @Temp_EndTime=@EndTime
SET @temp_StartHour=DATEPART(HOUR, @StartTime)
SET @temp_EndHour=DATEPART(HOUR, @EndTime)
SET @temp_StartMinute=DATEPART(MI, @StartTime)
SET @temp_EndMinute=DATEPART(MI, @EndTime)

PRINT @temp_StartHour
PRINT @temp_EndHour
PRINT @temp_StartMinute
PRINT @StartTime
PRINT @EndTime

if(@temp_EndMinute>0)
    BEGIN
        SET @temp_EndHour=@temp_EndHour+1
    END

--this declares the temp table 

DECLARE @Temp_Table TABLE
(
OutageDate date,
StartHour int,
StartMinute int,
EndHour int,
EndMinute int,
StartTime time,
EndTime time,
Duration int
)

--Here's the loop that inserts the rows

While((@temp_EndHour-@temp_StartHour>1))
    BEGIN
       INSERT INTO @Temp_Table
       SELECT 
            @OutageDate AS OutageDate,  
           (DATEPART(HOUR, @Temp_StartTime)) AS StartHour,
           (DATEPART(MINUTE, @Temp_StartTime)) AS StartMinute, 
            @temp_StartHour+1 AS EndHour, 
            0 AS EndMinute,
            @StartTime as StartTime, 
            @EndTime as EndTime,
           @Duration AS Duration


--DATEADD returns a specified date with the specified number interval (signed integer) added to a specified datepart of that date.

        SET @temp_StartHour=@temp_StartHour+1
        SET @Temp_StartTime=DATEADD(HOUR,1,@Temp_StartTime)

--Let's make sure we account for the minutes in the first and last hours if any

        if(DATEPART(MI, @Temp_StartTime)!=0)
            BEGIN
                SET @Temp_StartTime=DATEADD(MI,-@Temp_StartMinute,@Temp_StartTime)
            END
    END

--Ok, if we're at the last row insertion, we still need the minutes the outage finished at...those go into StartMinutes

    WHile((@temp_EndHour-@temp_StartHour=1))
    BEGIN
       INSERT INTO @Temp_Table
       SELECT 
       @OutageDate AS OutageDate, 
       (DATEPART(HOUR, @Temp_StartTime)) AS StartHour, 
       @temp_EndMinute AS StartMinute, 
       @temp_StartHour+1 AS EndHour, 
      0 AS EndMinute, 
      @StartTime as StartTime, 
       @EndTime as EndTime,
       @Duration AS Duration

--DATEADD returns a specified date with the specified number interval (signed integer) added to a specified datepart of that date.

        SET @temp_StartHour=@temp_StartHour+1
        SET @Temp_StartTime=DATEADD(HOUR,1,@Temp_StartTime)

--Let's make sure we account for the minutes in the first and last hours if any

        if(DATEPART(MI, @Temp_StartTime)!=0)
            BEGIN
                SET @Temp_StartTime=DATEADD(MI,-@temp_StartMinute,@Temp_StartTime)
            END
    END

--Need to add logic that drops and recreates the table from the temp table so we don't have to employ a cursor

SELECT * FROM @Temp_Table

BEGIN
SELECT * INTO newTable FROM @Temp_Table
END

如果您直接在 SMS 中运行,您将得到最基本的逻辑:

declare @StartTime time
declare @EndTime time
declare @Temp_StartTime time

declare @temp_StartHour int
declare @temp_EndHour int
declare @temp_StartMinute int
declare @temp_EndMinute int

SET @StartTime='2:30:00'
SET @EndTime='4:01:00'
SET @Temp_StartTime=@StartTime

SET @temp_StartHour=DATEPART(HOUR, @StartTime)
SET @temp_EndHour=DATEPART(HOUR, @EndTime)
SET @temp_StartMinute=DATEPART(MI, @StartTime)
SET @temp_EndMinute=DATEPART(MI, @EndTime)

if(@temp_EndMinute>0)
    BEGIN
        SET @temp_EndHour=@temp_EndHour+1
    END

DECLARE @Temp_Table TABLE
(
  StartHour int,
  StartMinute int,
  EndHour int,
  EndMinute int,
  StartTime time,
  EndTime time
)

WHile((@temp_EndHour-@temp_StartHour>=1))
    BEGIN
        INSERT INTO @Temp_Table
        SELECT (DATEPART(HOUR, @Temp_StartTime)) AS StartHour,(DATEPART(MINUTE, @Temp_StartTime)) AS StartMinute,
        @temp_StartHour+1 AS EndHour, 
        0 AS EndMinute, @StartTime as StartTime, @EndTime as EndTime

        SET @temp_StartHour=@temp_StartHour+1
        SET @Temp_StartTime=DATEADD(HOUR,1,@Temp_StartTime)

        if(DATEPART(MI, @Temp_StartTime)!=0)
            BEGIN
                SET @Temp_StartTime=DATEADD(MI,-@temp_StartMinute,@Temp_StartTime)
            END
    END

SELECT * FROM @Temp_Table 

首先,一些设置:

USE tempdb;
GO

CREATE TABLE dbo.Outages
(
    OutageDate DATE,
    StartTime TIME(7),
    EndTime TIME(7),
    Duration INT
);

INSERT dbo.Outages SELECT '20101110', '16:00', '17:30', 90;
/*
-- I also tested these cases, and *think* it still produces what you expect:
INSERT dbo.Outages SELECT '20101111', '13:00', '14:02', 62;
INSERT dbo.Outages SELECT '20101112', '17:00', '18:00', 60;
INSERT dbo.Outages SELECT '20101113', '16:05', '16:25', 20;
INSERT dbo.Outages SELECT '20101114', '16:59', '18:01', 62;
INSERT dbo.Outages SELECT '20101115', '22:15', '01:30', 165;
*/

现在,查询:

;WITH n(n) AS 
(
  SELECT TOP 24 ROW_NUMBER() OVER (ORDER BY [object_id])
  FROM sys.objects
),
x AS
(
  SELECT 
    o.OutageDate, StartHour = (DATEPART(HOUR, StartTime) + n.n - 1) % 24,
    StartTime, EndTime, Duration,
    rn = ROW_NUMBER() OVER (PARTITION BY o.OutageDate, o.StartTime ORDER BY n.n)
  FROM n INNER JOIN dbo.Outages AS o
  ON n.n <= CEILING(DATEDIFF(MINUTE, CONVERT(DATETIME, StartTime), 
    DATEADD(DAY, CASE WHEN EndTime < StartTime THEN 1 ELSE 0 END, 
    CONVERT(DATETIME, EndTime)))/60.0)
 ),
 mx AS (SELECT OutageDate, StartTime, minrn = MIN(rn), maxrn = MAX(rn) 
   FROM x GROUP BY OutageDate, StartTime)

 -- insert into some other table
 SELECT 
    x.OutageDate, 
    x.StartHour, 
    StartMinutes = CASE 
      WHEN x.rn = mx.minrn THEN DATEPART(MINUTE, x.StartTime) ELSE 0 END,
    EndHour = x.StartHour + 1, 
    EndMinutes = CASE
      WHEN x.rn = mx.maxrn THEN DATEPART(MINUTE, x.EndTime) ELSE 0 END,
    x.StartTime, 
    x.EndTime,
    x.Duration
 FROM x INNER JOIN mx 
 ON x.OutageDate = mx.OutageDate
 AND x.StartTime = mx.StartTime
 ORDER BY x.OutageDate, x.rn;
GO

当您很高兴它为您提供了适合各种场景的正确行时,然后替换

-- insert into some other table

使用实际插入,例如

INSERT dbo.OtherTable(col1, col2, ...)

如果您尝试从此输出创建一个全新的表,请替换

FROM x INNER JOIN mx

使用 INTO 子句,例如

INTO dbo.MyNewTable FROM x INNER JOIN mx

不要忘记清理:

DROP TABLE dbo.Outages;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

需要通过临时表中的 ID 更新存储过程中的行 的相关文章

  • SQL - != 'NULL' 的解释

    我的SSMS代码如下 Select top 50 From FilteredContact Where statuscode 1 and emailaddress1 NULL and telephone1 NULL and address1
  • 普通表还是全局临时表?

    我和另一位开发人员正在讨论哪种类型的表更适合我们的任务 它基本上是一个我们将在一天结束时截断的缓存 就我个人而言 我认为没有任何理由为此使用除普通表之外的任何内容 但他想使用全局临时表 其中之一有什么优点吗 使用普通表tempdb如果这只是
  • SQL中的NULL和编程语言中的NULL之间的区别

    我刚刚遇到一个关于如何在 T SQL 可能还有其他形式的 SQL 中处理 NULL 的有趣场景 这个问题得到了很好的描述和回答这个问题 https stackoverflow com questions 2866714 how does a
  • 用户“”登录失败,无法打开登录请求的数据库“Database1.mdf”。登录失败。用户“rBcollo-PC\rBcollo”登录失败

    所以 我几乎解决了所有问题 但现在我要处理另一个问题 我使用了这个连接字符串 SqlConnection con new SqlConnection Data Source SQLEXPRESS Database Database1 mdf
  • 将 SQL Server 与 Dart 结合使用

    我还没有找到很好的答案 所以我想尝试一下得到答案 将 Microsoft SQL Server 与 Dart 结合使用的最佳方式是什么 我需要它能够从基本上任何操作系统 网络和移动设备上使用它 我觉得最好的方法可能是 GraphQL 但我对
  • 无法使用 Tedious 和 Node JS 连接到本地 SQL Server 数据库

    我正在尝试连接到本地计算机上的 SQL Server 我正在尝试使用乏味和乏味 ntlm 两者的配置如下 var tds require tedious ntlm var tds require tedious var config use
  • 将 .MDF SQL Server 数据库与 ASP.NET 结合使用与使用 SQL Server

    我目前正在 ASP NET MVC 中编写一个网站 我的数据库 其中还没有任何数据 只有正确的表 使用 SQL Server 2008 我已将其安装在我的开发计算机上 我使用服务器资源管理器从应用程序连接到数据库 然后使用 LINQ to
  • 如何使用 Windows 身份验证指定 Windows 用户从 ASP 连接到 MS SQL Server 数据库

    我已经尝试了一个多月的时间来将这里的 ASP 脚本连接到 SQL Server 数据库 但每次我使用这个连接字符串时 Data Source dbServer01 Initial Catalog POS123 Integrated Secu
  • 在c#中创建sql连接

    我是这个网站的新手 也是编程的新手 我目前正在通过销售点创建库存系统 它使用模态和非模态形式 我的问题是 我正在研究change password对话框必须连接到数据库才能覆盖密码字段 我使用的数据库是Microsoft SQL Serve
  • 加密数据库字段的好方法?

    我被要求加密数据库中的各种数据库字段 问题是这些字段在读取后需要解密 我在用着Django and SQL Server 2005 有什么好主意吗 See 在 SQL Server 2005 数据库中使用对称加密 https web arc
  • 如何将 数组传递给存储过程

    我有一个清单索赔数据在 C 中 它有三个项目 日期 类型和描述 其中可以有多行 如下所示 索赔数据 Date Type Description 01 02 2012 Medical Its a medical 05 02 2013 Thef
  • MySQL 错误 1172 - 结果包含多行

    在存储过程中运行查询时 我从 MySQL 收到此错误 错误代码 1172 结果包含多行 我理解错误 我正在做一个SELECT INTO var list 因此查询需要返回单行 当我使用LIMIT 1 or SELECT DISTINCT 错
  • 如何搜索例程的内容/(SP-触发函数)

    我需要在数据库内所有例程的例程主体 存储过程 函数 触发器 中搜索文本 我该怎么做 Thanks SELECT OBJECT NAME object id FROM sys sql modules WHERE definition LIKE
  • 使用 Dapper 插入时出现 NullReferenceException

    当我运行以下代码时 我收到一个 NullReferenceException 异常 指出对象引用未设置到该对象的实例 我已经使用不太复杂但格式相同的对象成功插入了 dapper 所以我不确定我做错了什么 public void Foo IE
  • 删除数据库中的行后如何重新排序ID

    我正在使用 C 来制作具有 sql 数据库的程序 在数据库中我有一个名为Workers 它有一个自动增量和主键ID column 当我删除一条记录时 ID 之间会出现间隙 删除记录后如何重新排序 ID UPDATE 我要做的就是找到记录后将
  • MYSQL - 使用逗号分隔字符串作为变量输入的存储过程

    我希望有人能够提供帮助 我已经创建了我的第一个存储过程 没什么花哨的 但是我遇到了问题 我想给它一个字符串输入 例如 1 2 3 4 5 然后它执行一个简单的操作SELECT FROM TABLE WHERE EAN IN VAR 所以存储
  • 循环预定义值

    有没有办法在 oracle 中执行 for every 如下所示 begin for VAR in 1 2 5 loop dbms output put line The value VAR end loop end 我知道你可以这样做 b
  • SQL Server 数据库架构版本控制和更新

    对于我的应用程序 我必须支持更新方案 并且数据库可能会受到影响 我希望能够从旧版本更新到最新版本 而无需安装中间版本 例如 假设我有版本 A 最旧的版本 B 中间版本 和 C 新版本 我希望能够将版本 A 直接更新到版本 C 对于应用程序文
  • 通知设置的数据库设计

    用户可以打开或关闭 他的通知设置 帐户 用于通知 例如 更改帐户资料信息 收到新消息等 通知可以通过电子邮件或手机 推送或短信 发送 用户可以只有 1 封电子邮件和多个手机设备 有什么方法可以改进以下数据库设计或者您会采取不同的方式吗 让我
  • 如何通过SQL查询检查是否有JSON函数?

    有SQL 2016 中的 JSON 函数 https learn microsoft com en us sql t sql functions json functions transact sql例如 JSON VALUE JSON Q

随机推荐

  • C 中指向二维数组的指针

    我知道有几个关于提供良好 和有效 解决方案的问题 但恕我直言 没有一个问题清楚地说明实现这一目标的最佳方法是什么 所以 假设我们有一些二维数组 int tab1 100 280 我们想要创建一个指向这个二维数组的指针 为了实现这一目标 我们
  • iOS - 将 NSDictionary 写入 Localized.strings

    这个问题是那个问题的连续体 iOS 我可以在运行时更改 localized strings 内容吗 https stackoverflow com questions 13625008 ios could i change the loca
  • 手工制作的强类型 ADO.net 数据表 - 它可以更干净吗?

    我最近遇到一个非常简单的类型化数据表 不使用 XSD 我丢失了作者的 URL 所以我不能相信他 但看起来有很多重复的代码 例如添加 删除 GetNewRow 方法 我尝试将重复的方法推入超类中 但由于 Employee 需要通用 因此出现了
  • 为什么 F# printfn 没有通过 Console.WriteLine 实现?

    我注意到使用 F printfn 时出现意外行为 它似乎将格式字符串分解为块 并为每次调用 printfn 多次调用 Console Write 我希望它格式化整个字符串 然后调用 Console WriteLine 一次 我注意到这一点是
  • 将 ASP.NET MVC ViewResult HTML 渲染为图像,无需第三方组件

    有没有办法将 ViewResult 或 PartialViewResult 渲染为图像 我尝试将 ViewResult 作为字符串获取 并且得到了一个包含 html 的字符串 但我需要将该 html 渲染为图像 如果可能的话 带样式和图像
  • Angular2 中的文件内容

    我正在编写一个小应用程序来执行一些 XML 文件聚合 用户删除一些具有相同结构的 XML 文件 编辑一些常见标签 然后我向他们返回一个 xml 其中包含元素列表中的所有所需数据 我正在使用 ng2 file upload 来进行文件删除 但
  • Java定义显式包私有修饰符[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 显然Java有一个Access级别包私有 https docs oracle com javase tutorial java javaOO a
  • 路径验证 - 我的正则表达式匹配格式错误的路径,但我不明白为什么

    这是我现在的表情 https regex101 com r BertHu 4 https regex101 com r BertHu 4 a z a z0 9 a z0 9 lt gt r n lt gt r n lt gt r n 我使用
  • IIS6中哪个w3wp.exe进程属于哪个应用程序池(使用powershell)

    到目前为止 我使用这个工具来判断哪个 w3wp 属于哪个应用程序池 c windows system32 cscript iisapp vbs 如何使用 Powershell 提取相同的信息 或者也许会得到更多信息丰富的结果 谢谢 这绝不是
  • 为什么 Scanf 在获取角色时工作很奇怪

    程序说明 我编写了一个程序 它接受用户无限号的字符输入 次数并打印输入的输入 这是程序 include
  • Pandas:使用合并单元格读取 Excel

    我有包含多个工作表的 Excel 文件 每个工作表看起来都有点像这样 但更长 Sample CD4 CD8 Day 1 8311 17 3 6 44 8312 13 6 3 50 8321 19 8 5 88 8322 13 5 4 09
  • 速度:将聚合值存储在数据库中还是使用 Jinja 进行计算?

    语言 Python 数据库 SQLite 使用 Flask SQLAlchemy ORM 我的问题本身可能有点过分了 但我很好奇 我在 SQLAlchemy 中有列Table其中包含我需要执行数学运算的某些值 以显示聚合值或计算值 我们假设
  • 如何通过.NET/C# 查找CPU 核心数?

    有没有办法通过 NET C 找出CPU核心数 PS这是一个直接的代码问题 而不是 我应该使用多线程吗 问题 您可以获得与处理器相关的多种不同信息 物理处理器数量 核心数 逻辑处理器的数量 这些都可以不同 如果机器具有 2 个支持超线程的双核
  • Django 1.9 不会在链接中呈现正确的页面

    演示 urls py from django conf urls import url include patterns from django contrib import admin import views from import v
  • 用于嵌入式系统的 C 语言中最快的数组查找算法?

    假设我有一个定义大小为 22 的浮点数常量数组 如下所示 array 0 0 array 1 0 5 array 2 0 7 array 3 1 8 array 21 4 2 该数组的值是单调的 也就是说 它们总是随着索引增加 array
  • 推送通知服务器端实现

    最近 我已将 FCM 集成到我的应用程序最新版本中 但我以前版本的应用程序使用的是 GCM 关于我们是否需要为 GCM 和 FCM 分离后台 cron 的写入有什么想法吗 我的先前版本 MY App 4 0 使用了 GCM 当前版本 My
  • 在解释器中实现 Brainfuck 循环

    我想用我新创建的编程语言构建一个 Brainfuck 该死的名字 解释器 以证明它的图灵完备性 现在 到目前为止一切都清楚了 lt gt 除了一件事 循环 我假设您从这里开始就知道 极其困难的 BF 语法 如何在解释器中实现 BF 循环 伪
  • 如何在 iOS 中为自定义属性设置动画

    我有一个自定义 UIView 它使用 Core Graphics 调用来绘制其内容 一切正常 但现在我想要动画影响显示的值的变化 我有一个自定义属性可以在我的自定义 UView 中实现此目的 var anime CGFloat 0 var
  • Symfony - 如何知道控制台命令是从控制器运行还是从终端运行?

    我正在构建使用控制台命令的 Symfony 应用程序 可以通过事件从控制器执行相同的控制台命令 但也可以从终端运行 如何从命令的运行位置找出它 以便在从终端运行命令时可以实现用户身份验证 如果命令是从控制器运行的 则用户已经具有运行权限 但
  • 需要通过临时表中的 ID 更新存储过程中的行

    我试图在表中获取描述中断的行 并通过计算的时间范围将它们分成单独的行 然后插入到另一个表中 以描述每个给定范围内的每小时时间段 下面的代码为我们提供了以下输出 我们从这一行 原始数据 开始 OutageDate StartTime EndT