需要通过临时表中的 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 更新存储过程中的行 的相关文章

  • ADO.NET SQLServer:如何防止关闭的连接持有S-DB锁?

    i Dispose http msdn microsoft com en us library system data sqlclient sqlconnection close aspx一个 SqlConnection 对象 但是当然它并
  • 替换字符串中的多个字符,而不使用任何嵌套替换函数

    我的表中存储了一个方程 我一次获取一个方程 并希望将所有运算符替换为任何其他字符 输入字符串 N 100 6858 6858 N 100 0 2 N 35 运算符或模式 替换字符 输出字符串 N 100 6858 6858 N 100 0
  • 如何在Word 2010中从SQL数据库检索数据?

    我想用 MS SQL 数据库中的数据填充 Word 文档 这可能吗 如果可能的话 如何实现 我过去曾通过多种方式做到这一点 这取决于用户是从 Microsoft Word 外部还是从 Microsoft Word 内部启动操作 From I
  • 如何将 SQL Server 中同一表中的一列插入到另一列中

    我需要将一列的数据插入到同一个表中的另一列中 谁能告诉我这个怎么写 Thanks UPDATE table SET col 2 col 1
  • 插入多行而不重复语句的“INSERT INTO ...”部分?

    我知道我几年前就已经这样做过 但我不记得语法了 而且由于提取了大量有关 批量导入 的帮助文档和文章 我在任何地方都找不到它 这就是我想做的 但语法不完全正确 请以前做过此操作的人帮助我 INSERT INTO dbo MyTable ID
  • SQL Server 读提交隔离级别到底如何工作?

    恕我直言 我发现两个关于如何进行不一致的描述ReadCommitted有效 均在 MSDN 文档中 https msdn microsoft com en us library ms173763 aspx https msdn micros
  • 查询嵌套查询结果中两列的位置

    我正在编写这样的查询 select from myTable where X in select X from Y and XX in select X from Y X 列和 XX 列的值必须位于同一查询的结果中 select X fro
  • 根据最大值连接表

    这是我正在谈论的内容的一个简化示例 Table students exam results id name id student id score date 1 Jim 1 1 73 8 1 09 2 Joe 2 1 67 9 2 09 3
  • 从完整路径解析文件名和路径

    我需要使用 SQL 查询从完整路径解析文件名和文件路径 例如 完整路径 SERVER D EXPORTFILES EXPORT001 csv FileName Path EXPORT001 csv SERVER D EXPORTFILES
  • EF6 不从数据库生成外键关联

    PROBLEM 我正在尝试使用数据库优先方法创建 EF6 模型 简单来说 我有2张桌子tblUser and tblMilkMan上有外键关系UserID柱子 但是当我创建一个新的 EDMX 图并添加 2 个表时 我看不到其中的关系 未创建
  • SQL Server 中全文搜索的奇怪行为

    我的 MyTable 带有列消息 NVARCHAR MAX ID 为 1 的记录包含消息 0123456789333444 Test 当我运行以下查询时 DECLARE Keyword NVARCHAR 100 SET Keyword 01
  • 使用 SQL 扩展事件捕获链接服务器查询

    我尝试了许多事件类型 但无法实现链接服务器的日志记录 我可以找出所有其他数据库的事件 但对于链接服务器却没有运气 有什么建议 您可以使用OLEDB DATA READ跟踪对链接服务器的查询的事件 如果此事件的结果比您想要的更详细 您可能需要
  • Java 和 SQL Server 中的精度噩梦

    我一直在与 Java 和 SQL Server 中的精确噩梦作斗争 直到我不再知道了 就我个人而言 我理解这个问题及其根本原因 但向地球另一端的客户解释这一点是不可行的 至少对我来说 情况是这样的 我在 SQL Server 中有两列 Qt
  • 从头开始构建 OLAP 解决方案时应该注意什么?

    我在一家运行基于 MS SQL 数据库服务器的软件产品的公司工作 多年来我已经用 PHP 开发了 20 30 个相当高级的报告 直接从数据库获取数据 这非常成功 人们对此感到高兴 但它有一些缺点 对于新的变化 它可能是相当开发密集型的 用户
  • 什么是多维 OLAP CUBE 并给出超过 3 维的多维数据集示例

    由于我是 SSAS 的新手 一直在阅读有关多维 OLAP 多维数据集的文章 并努力理解多维数据集的概念 据说虽然术语 多维数据集 表示三个维度 但多维数据集最多可以有 64 个维度 你能解释一下这在立方体上怎么可能吗 除了 3 Dim 示例
  • 了解 SQL Server 排序规则中的 Unicode 和代码页

    为什么所有 SQL Server 2008 R2 排序规则都与代码页相关联 所有排序规则都是 unicode 吗 当您的数据库被使用不同代码页的多种语言使用时 如何选择排序规则 谢谢 CHAR 与 NCHAR 即非 Unicode 与 Un
  • 将数据表传递到存储过程。有没有更好的办法?

    数据表可以以某种方式传递到 SQL Server 2005 或 2008 中吗 我知道标准方法似乎是将 XML 传递给 SP 并且可以通过某种方式轻松地将数据表转换为 XML 来实现这一点 将 NET 对象传递到 SP 怎么样 那可能吗 我
  • 从一张表更新并插入另一张表

    我有两张桌子 table1 ID 代码 姓名 table2 ID 代码 姓名 具有相同的列 我想将数据从 table1 插入到 table2 或更新列 如果 table2 中存在 table1 ID table2 ID 执行此操作的简单方法
  • Razor C# - 从数据库获取数据

    我正在使用 WebMatrix 我创建了一个数据库并放置了一个包含几行数据的表 我可以连接到它并获取数据WebGrid 但它只提供了一种使用表格输出数据的方法 这是我的 shows cshtml 代码 var db Database Ope
  • 如何安全地使用保留的 SQL 名称?

    我正在使用 Cakephp 3 使用 sqlserver 作为数据源服务器 我确信我的数据库连接没有问题 因为 home ctp 提示我已连接到我的数据库 并且我还使用迁移插件来创建我的表 似乎使用它没有问题这些工具 但是在我烘焙 MVC

随机推荐

  • 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