【问题标题】:Table update to set correct date-time for each row表更新为每一行设置正确的日期时间
【发布时间】:2021-06-15 22:08:23
【问题描述】:

我有以下 SQL Server (2019) 表:

CREATE TABLE [dbo].[log_Current](
   [line_number] [int] NULL,
   [Time] [time](7) NULL,
   [server_time_initial] [datetime] NULL,
   [Correct_Date_Time] [datetime] NULL
) ON [PRIMARY]
GO

数据:

line_number Time server_time_initial Correct_Date_Time
69 07:05:08.0000000 2021-05-15 07:05:05.000 NULL
72 07:05:25.0000000 2021-05-15 07:05:05.000
73 07:05:30.0000000 2021-05-15 07:05:05.000
215 16:34:36.0000000 2021-05-15 07:05:05.000
216 16:56:01.0000000 2021-05-15 07:05:05.000
283 21:06:02.0000000 2021-05-15 07:05:05.000
284 21:08:52.0000000 2021-05-15 07:05:05.000
511 23:57:06.0000000 2021-05-15 07:05:05.000
512 23:57:07.0000000 2021-05-15 07:05:05.000
513 00:00:05.0000000 2021-05-15 07:05:05.000
514 00:01:57.0000000 2021-05-15 07:05:05.000
633 02:49:06.0000000 2021-05-15 07:05:05.000
634 02:49:08.0000000 2021-05-15 07:05:05.000
1074 05:13:58.0000000 2021-05-15 07:05:05.000
1075 05:13:59.0000000 2021-05-15 07:05:05.000
1888 23:53:52.0000000 2021-05-15 07:05:05.000
1889 23:54:08.0000000 2021-05-15 07:05:05.000
1890 00:00:16.0000000 2021-05-15 07:05:05.000
1891 00:00:16.0000000 2021-05-15 07:05:05.000

等等……

字段:

  • [server_time_initial] 对于所有行都相同,表示提取日志的时间。等于 2021-05-15 07:05:05

  • [line_number] 为日志入口顺序

  • [Time] 是日志条目的时间,但遗憾的是没有日期。

  • Correct_Date_Time - 必须为每行填写正确的日期 + 时间。正如您所看到的,时间条目从早上的某个时间开始(不一定在 O AM),然后过了午夜,等等……这种模式持续了好几天。 第一批,表示从 07:05:08 到 23:57:07 的时间,在 2021-05-15 输入到 [line_number] 512。从[line_number] 513是第二天,即2021-05-16,到[line_number] 1889。然后,从[line_number] 1890,进入日期是2021-05-17等......

所需结果应更新 [Correct_Date_Time] 列:

  **line_number  Time       server_time_initial**    Correct_Date_Time
  69    07:05:08.0000000    2021-05-15 07:05:05.000      2021-05-15 07:05:08
  72    07:05:25.0000000    2021-05-15 07:05:05.000      2021-05-15 07:05:25 
  73    07:05:30.0000000    2021-05-15 07:05:05.000      2021-05-15 07:05:30   
 215    16:34:36.0000000    2021-05-15 07:05:05.000      2021-05-15 16:34:36 
 216    16:56:01.0000000    2021-05-15 07:05:05.000           etc...
 283    21:06:02.0000000    2021-05-15 07:05:05.000
 284    21:08:52.0000000    2021-05-15 07:05:05.000
 511    23:57:06.0000000    2021-05-15 07:05:05.000
 512    23:57:07.0000000    2021-05-15 07:05:05.000      2021-05-15 23:57:07
 513    00:00:05.0000000    2021-05-15 07:05:05.000      2021-05-16 00:00:05
 514    00:01:57.0000000    2021-05-15 07:05:05.000            etc...
 633    02:49:06.0000000    2021-05-15 07:05:05.000
 634    02:49:08.0000000    2021-05-15 07:05:05.000
 1074   05:13:58.0000000    2021-05-15 07:05:05.000
 1075   05:13:59.0000000    2021-05-15 07:05:05.000
 1888   23:53:52.0000000    2021-05-15 07:05:05.000
 1889   23:54:08.0000000    2021-05-15 07:05:05.000    2021-05-16 23:54:08 
 1890   00:00:16.0000000    2021-05-15 07:05:05.000    2021-05-17 00:00:16 
 1891   00:00:31.0000000    2021-05-15 07:05:05.000    2021-05-17 00:00:31

【问题讨论】:

  • 你试过什么?请更新您的问题,尽您最大的努力自己解决。

标签: sql sql-server


【解决方案1】:

使用lag([Time]) 比较[Time] 以找到第二天的交叉点

[Time] < lag([Time]) over (order by line_number)

交叉后的线,d = 1 else 0

d = case when [Time] < lag([Time]) over (order by line_number)
         then 1
         else 0 
         end

你可以计算从一开始的累计偏移天数(总天数偏移)

sum(d) over (order by line_number) 

将时间设置为00:00:00

dateadd(day, datediff(day, 0, server_time_initial), 0)

Final corrected time = server_time_initial (with Time 00:00:00)
                     + total days offset
                     + [Time]

把它们放在一起,

with cte
as 
(
    select  *,
            d = case when [Time] < lag([Time]) over (order by line_number)
                     then 1
                     else 0 
                     end
    from    [log_Current]
)
select  *,
        dateadd(day,
                sum(d) over (order by line_number),
                dateadd(day, datediff(day, 0, server_time_initial), 0) )
        + convert(varchar(10), [Time], 108) as Correct_Date_Time
from    cte
order by line_number

db<>fiddle demo

【讨论】:

  • 感谢松鼠的帮助,非常好的解决方案!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-08
  • 1970-01-01
  • 2020-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多