基于Name字段字母排序递增更新SQL Server 2019的DateTime列
SQL Server 2019 按Name排序递增更新Created字段时间
需求:现有表包含varchar类型的Name字段和datetime类型的Created字段,需按Name字母升序排序,从指定起始时间(或当前时间)开始,依次递增更新Created字段的时间值。
示例原表
Id Name Created 1 FMI 2023-03-01 12:01:16 2 MMT 2023-03-22 15:45:31 3 TPH 2023-08-10 10:10:19 4 TPA 2023-08-10 10:12:01 5 SMA 2023-09-07 09:51:13 6 NUA 2023-09-13 17:11:05
期望输出
Id Name Created 1 FMI 2024-02-06 15:14:42 2 MMT 2024-02-06 15:14:43 6 NUA 2024-02-06 15:14:44 5 SMA 2024-02-06 15:14:45 4 TPA 2024-02-06 15:14:46 3 TPH 2024-02-06 15:14:47
解决方案
使用SQL Server的**CTE(公共表表达式)**结合窗口函数ROW_NUMBER()实现排序,再通过DATEADD()递增时间:
-- 替换YourTableName为实际表名 WITH SortedRecords AS ( SELECT Id, Created, -- 按Name升序分配行号 ROW_NUMBER() OVER (ORDER BY Name ASC) AS RowNum FROM YourTableName ) UPDATE SortedRecords -- 以当前时间为基准,每条记录递增1秒(可调整间隔) SET Created = DATEADD(SECOND, RowNum - 1, GETDATE())
说明
- 排序逻辑:
ROW_NUMBER() OVER (ORDER BY Name ASC)按Name字母顺序给每条记录分配连续行号,行号从1开始。 - 时间递增:
DATEADD(SECOND, RowNum - 1, GETDATE())中:GETDATE()取当前系统时间作为起始时间,若需固定起始时间,替换为指定datetime值(如'2024-02-06 15:14:42')。RowNum - 1确保第一条记录使用起始时间,后续每条比前一条多1秒;若需其他间隔(如5秒),改为(RowNum - 1) * 5即可。
- 执行注意:执行前建议先通过
SELECT验证CTE的排序结果,避免误更新:SELECT * FROM SortedRecords ORDER BY RowNum
内容的提问来源于stack exchange,提问作者MF Luder
相关产品推荐
相关产品推荐

