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

