SQL Server表更新:为日志表每行填充正确的日期时间字段值
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
字段说明
server_time_initial:所有行取值相同,代表日志提取时间,固定为2021-05-15 07:05:05line_number:日志条目排序编号Time:日志生成时间,仅包含时分秒,无日期信息Correct_Date_Time:待填充字段,需要写入每行对应的完整日期+时间。日志时间从早间开始递增,跨午夜后日期加1:line_number≤512的记录日期为2021-05-15,513≤line_number≤1889的记录日期为2021-05-16,line_number≥1890的记录日期为2021-05-17,以此类推。
实现方案
方案1:匹配指定分段规则更新
直接按照题目给出的line_number区间判断日期偏移,逻辑简单直观:
UPDATE [dbo].[log_Current] SET [Correct_Date_Time] = DATEADD( DAY, CASE WHEN line_number <= 512 THEN 0 WHEN line_number BETWEEN 513 AND 1889 THEN 1 ELSE 2 END, CAST('2021-05-15' AS DATETIME) ) + CAST([Time] AS DATETIME)
方案2:通用自动偏移计算(支持更多跨天场景)
根据分段规律自动计算天数偏移,无需手动扩展CASE分支即可适配更多后续跨天数据:
UPDATE [dbo].[log_Current] SET [Correct_Date_Time] = DATEADD( DAY, CASE WHEN line_number <= 512 THEN 0 ELSE 1 + (line_number - 513) / 1377 END, CAST('2021-05-15' AS DATETIME) ) + CAST([Time] AS DATETIME)
结果验证
执行更新后可通过以下语句校验结果是否符合预期:
SELECT line_number, [Time], server_time_initial, Correct_Date_Time FROM [dbo].[log_Current] WHERE line_number IN (69,72,512,513,1889,1890)
预期输出:
| 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.000 |
| 72 | 07:05:25.0000000 | 2021-05-15 07:05:05.000 | 2021-05-15 07:05:25.000 |
| 512 | 23:57:07.0000000 | 2021-05-15 07:05:05.000 | 2021-05-15 23:57:07.000 |
| 513 | 00:00:05.0000000 | 2021-05-15 07:05:05.000 | 2021-05-16 00:00:05.000 |
| 1889 | 23:54:08.0000000 | 2021-05-15 07:05:05.000 | 2021-05-16 23:54:08.000 |
| 1890 | 00:00:16.0000000 | 2021-05-15 07:05:05.000 | 2021-05-17 00:00:16.000 |
内容的提问来源于stack exchange,提问作者user10157300
相关产品推荐
相关产品推荐

