You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将Datetime类型列数据复制到同表Date类型列时原列被置为NULL的问题及格式转换方法咨询

解决SQL日期列误更新与格式转换问题

先搞定误操作的烂摊子

兄弟,你这次完全搞反了UPDATE的赋值方向啊!把刚创建的空LastLoginDate-NoTime列(当时还没数据对吧?)的值塞给了原本有数据的LastLoginDate,结果原列直接变成NULL了。

如果你的数据库有最近的备份,那赶紧从备份恢复这张表或者对应的数据,这是最靠谱的办法。要是没备份的话,那被覆盖成NULL的数据基本救不回来了——除非你的库开了变更数据捕获(CDC)或者有完整的日志备份才能尝试恢复,但操作起来挺麻烦的。

正确把Datetime转存到Date列的方法

接下来咱们说正事:怎么把LastLoginDate的日期时间数据,转成仅日期格式存入LastLoginDate-NoTime列。在SQL Server里其实很简单,有几种方式:

方式1:直接赋值(最省事)

因为目标列是Date类型,SQL Server会自动帮你截断时间部分,只保留日期:

UPDATE [dbo].[SapUsersExt] 
SET [LastLoginDate-NoTime] = [LastLoginDate]

方式2:用CAST()显式转换(逻辑更清晰)

要是想让代码可读性更高,明确表明是做类型转换,就用CAST:

UPDATE [dbo].[SapUsersExt] 
SET [LastLoginDate-NoTime] = CAST([LastLoginDate] AS DATE)

方式3:用CONVERT()函数(灵活度更高)

如果以后需要指定日期格式(不过这里目标列是Date类型,其实没必要,但可以了解下):

UPDATE [dbo].[SapUsersExt] 
SET [LastLoginDate-NoTime] = CONVERT(DATE, [LastLoginDate])

给你提个后续维护的小建议

  • 以后执行UPDATE前,一定要先跑个SELECT验证结果!比如先查一下转换后的值对不对:
    SELECT [LastLoginDate], [LastLoginDate-NoTime], CAST([LastLoginDate] AS DATE)
    FROM [dbo].[SapUsersExt]
    
    确认没问题再执行UPDATE,别再犯这种赋值方向搞反的错了。
  • 要是这个日期同步需要长期维护(比如每次LastLoginDate更新,LastLoginDate-NoTime也要跟着变),不如直接把LastLoginDate-NoTime改成计算列,这样数据库会自动同步,不用你手动更新:
    -- 先删掉原来的列
    ALTER TABLE [dbo].[SapUsersExt]
    DROP COLUMN [LastLoginDate-NoTime];
    
    -- 创建计算列,自动同步日期
    ALTER TABLE [dbo].[SapUsersExt]
    ADD [LastLoginDate-NoTime] AS CAST([LastLoginDate] AS DATE) PERSISTED;
    
    这样以后就再也不用手动执行UPDATE来同步了,还能避免误操作。

内容的提问来源于stack exchange,提问作者Aashu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 14:42:33