如何对超过正常 varchar 值的时间值(存储为 varchar)求和?
How can I sum time values (stored as varchars) that exceed the normal varchar value?
我正在处理的脚本有问题。我所拥有的是数据库中有关应用程序何时关闭、何时重新打开以及应用程序已关闭的总持续时间的值。使用我现在使用的脚本,有时 TotalDownTime 会超过 24 小时。这是故意的,我想保持这种状态。但是,我还希望能够根据这些应用程序关闭的原因将所有 TotalDownTimes 加在一起成为一个值。如何才能最好地实现这一点?
以下是我使用的一些示例:
Reason Shutdowndate StartupDate TotalDownTime
Scheduled Maintenance 2018-12-10 09:31:47.317 2018-12-10 11:31:47.317 02:00:00:000
Scheduled Maintenance 2018-12-10 09:38:00.373 2018-12-10 09:45:38.613 00:07:38:240
Scheduled Maintenance 2018-12-10 10:43:01.000 2018-12-18 08:22:02.873 21:39:01:873
Scheduled Maintenance 2018-12-16 00:01:07.697 2018-12-16 12:00:10.953 11:59:03:257
Scheduled Maintenance 2018-12-01 00:00:00.000 2018-12-18 13:54:16.500 421:54:16:000
Scheduled Maintenance 2018-12-06 00:00:00.000 2018-12-18 08:41:45.007 296:41:45
这是我用来分配 TotalDownTime 值的内容:
Update ProductionShutdownRecord
set TotalDownTime = CAST(DATEDIFF(HOUR, [ShutdownDate], [Startupdate]) AS VARCHAR)
+ RIGHT(CONVERT(CHAR(8),DATEADD(SECOND,DATEDIFF(SECOND, [ShutdownDate], [Startupdate]),0),114),6)
where shutdownId = 18
这是我尝试用来对值求和的方法,我得到的错误是“将 char 数据类型转换为 datetime 数据类型导致日期时间值超出范围。
":
select convert(char(8),dateadd(second,SUM ( DATEPART(hh,(convert(datetime,TotalDownTime,1))) * 3600 +
DATEPART(mi, (convert(datetime,TotalDownTime,1))) * 60 + DATEPART(ss,(convert(datetime,TotalDownTime,1)))),0),108)
FROM ProductionShutdownRecord
where Reason like 'Scheduled Maintenance%'
and ShutdownDate >= '01/01/2018'
and ShutdownDate <= '01/01/2019'
and startupdate is not null
感谢任何帮助,谢谢!
下面是一种方法,使用 FORMAT
来帮助格式化您的非标准时间格式:
WITH downtime AS (
SELECT
Reason
, Shutdowndate
, StartupDate
, DATEADD(millisecond, DATEDIFF(millisecond, Shutdowndate, StartupDate), '') AS DownTime
FROM dbo.ApplicationDowntime
)
SELECT
Reason
, Shutdowndate
, StartupDate
, FORMAT(((DATEPART(day, DownTime) - 1) * 24) + DATEPART(hour, DownTime), '00:')
+ FORMAT(DownTime, 'mm:ss:fff') AS TotalDownTime
FROM downtime;
请注意,示例结果的第三行 returns 189:39:01:873
:
+-----------------------+-------------------------+-------------------------+---------------+
| Reason | Shutdowndate | StartupDate | TotalDownTime |
+-----------------------+-------------------------+-------------------------+---------------+
| Scheduled Maintenance | 2018-12-10 09:31:47.317 | 2018-12-10 11:31:47.317 | 02:00:00:000 |
| Scheduled Maintenance | 2018-12-10 09:38:00.373 | 2018-12-10 09:45:38.613 | 00:07:38:240 |
| Scheduled Maintenance | 2018-12-10 10:43:01.000 | 2018-12-18 08:22:02.873 | 189:39:01:873 |
| Scheduled Maintenance | 2018-12-16 00:01:07.697 | 2018-12-16 12:00:10.953 | 11:59:03:257 |
| Scheduled Maintenance | 2018-12-01 00:00:00.000 | 2018-12-18 13:54:16.500 | 421:54:16:500 |
| Scheduled Maintenance | 2018-12-06 00:00:00.000 | 2018-12-18 08:41:45.007 | 296:41:45:007 |
+-----------------------+-------------------------+-------------------------+---------------+
您 table 中的字段是什么数据类型?
我会将 TotalDownTime 视为 INT 或 BIGINT,其差值以所需的最低时间部分的倍数存储。例如DATEDIFF(秒,启动更新,关机日期)或 DATEDIFF_BIG(秒,启动更新,关机日期)。那么 SUM 是微不足道的。
然后,以您想要的任何字符串格式获取它就变成了一个输出格式问题,这也应该是直截了当的 - 如果您需要数据库中直接可用的格式,请将计算字段添加到 table。
我正在处理的脚本有问题。我所拥有的是数据库中有关应用程序何时关闭、何时重新打开以及应用程序已关闭的总持续时间的值。使用我现在使用的脚本,有时 TotalDownTime 会超过 24 小时。这是故意的,我想保持这种状态。但是,我还希望能够根据这些应用程序关闭的原因将所有 TotalDownTimes 加在一起成为一个值。如何才能最好地实现这一点?
以下是我使用的一些示例:
Reason Shutdowndate StartupDate TotalDownTime
Scheduled Maintenance 2018-12-10 09:31:47.317 2018-12-10 11:31:47.317 02:00:00:000
Scheduled Maintenance 2018-12-10 09:38:00.373 2018-12-10 09:45:38.613 00:07:38:240
Scheduled Maintenance 2018-12-10 10:43:01.000 2018-12-18 08:22:02.873 21:39:01:873
Scheduled Maintenance 2018-12-16 00:01:07.697 2018-12-16 12:00:10.953 11:59:03:257
Scheduled Maintenance 2018-12-01 00:00:00.000 2018-12-18 13:54:16.500 421:54:16:000
Scheduled Maintenance 2018-12-06 00:00:00.000 2018-12-18 08:41:45.007 296:41:45
这是我用来分配 TotalDownTime 值的内容:
Update ProductionShutdownRecord
set TotalDownTime = CAST(DATEDIFF(HOUR, [ShutdownDate], [Startupdate]) AS VARCHAR)
+ RIGHT(CONVERT(CHAR(8),DATEADD(SECOND,DATEDIFF(SECOND, [ShutdownDate], [Startupdate]),0),114),6)
where shutdownId = 18
这是我尝试用来对值求和的方法,我得到的错误是“将 char 数据类型转换为 datetime 数据类型导致日期时间值超出范围。 ":
select convert(char(8),dateadd(second,SUM ( DATEPART(hh,(convert(datetime,TotalDownTime,1))) * 3600 +
DATEPART(mi, (convert(datetime,TotalDownTime,1))) * 60 + DATEPART(ss,(convert(datetime,TotalDownTime,1)))),0),108)
FROM ProductionShutdownRecord
where Reason like 'Scheduled Maintenance%'
and ShutdownDate >= '01/01/2018'
and ShutdownDate <= '01/01/2019'
and startupdate is not null
感谢任何帮助,谢谢!
下面是一种方法,使用 FORMAT
来帮助格式化您的非标准时间格式:
WITH downtime AS (
SELECT
Reason
, Shutdowndate
, StartupDate
, DATEADD(millisecond, DATEDIFF(millisecond, Shutdowndate, StartupDate), '') AS DownTime
FROM dbo.ApplicationDowntime
)
SELECT
Reason
, Shutdowndate
, StartupDate
, FORMAT(((DATEPART(day, DownTime) - 1) * 24) + DATEPART(hour, DownTime), '00:')
+ FORMAT(DownTime, 'mm:ss:fff') AS TotalDownTime
FROM downtime;
请注意,示例结果的第三行 returns 189:39:01:873
:
+-----------------------+-------------------------+-------------------------+---------------+
| Reason | Shutdowndate | StartupDate | TotalDownTime |
+-----------------------+-------------------------+-------------------------+---------------+
| Scheduled Maintenance | 2018-12-10 09:31:47.317 | 2018-12-10 11:31:47.317 | 02:00:00:000 |
| Scheduled Maintenance | 2018-12-10 09:38:00.373 | 2018-12-10 09:45:38.613 | 00:07:38:240 |
| Scheduled Maintenance | 2018-12-10 10:43:01.000 | 2018-12-18 08:22:02.873 | 189:39:01:873 |
| Scheduled Maintenance | 2018-12-16 00:01:07.697 | 2018-12-16 12:00:10.953 | 11:59:03:257 |
| Scheduled Maintenance | 2018-12-01 00:00:00.000 | 2018-12-18 13:54:16.500 | 421:54:16:500 |
| Scheduled Maintenance | 2018-12-06 00:00:00.000 | 2018-12-18 08:41:45.007 | 296:41:45:007 |
+-----------------------+-------------------------+-------------------------+---------------+
您 table 中的字段是什么数据类型?
我会将 TotalDownTime 视为 INT 或 BIGINT,其差值以所需的最低时间部分的倍数存储。例如DATEDIFF(秒,启动更新,关机日期)或 DATEDIFF_BIG(秒,启动更新,关机日期)。那么 SUM 是微不足道的。
然后,以您想要的任何字符串格式获取它就变成了一个输出格式问题,这也应该是直截了当的 - 如果您需要数据库中直接可用的格式,请将计算字段添加到 table。