为何UPDATE语句无法正确更新SQL Server时间戳,时分秒丢失?
解决MSSQL更新timestamp字段仅保留日期、时间归零的问题
针对你遇到的deletedAt字段更新后时间部分始终为00:00:00.000的问题,给你几个排查和解决方向:
先确认数据库字段类型
检查deletedAt的字段类型是不是DATE——如果是,这个类型本身只存储日期,时间部分会被自动截断。手动执行SQL能生效的话,大概率是你手动测试时用的字段类型是DATETIME/DATETIME2?执行下面的SQL确认:SELECT DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '你的表名' AND COLUMN_NAME = 'deletedAt';如果结果是
DATE,改成DATETIME2(3)(推荐,支持更高精度)或者DATETIME即可。改用参数传入时间,指定类型
虽然你代码里用了GETDATE(),但mssql驱动可能存在隐式转换问题。试试直接传入当前时间作为参数,并指定DateTime2类型:async deleteById<T>(params: DeletedBy): Promise<IResult<T> | undefined> { try { if (params.id) { const request = new mssql.Request(); request.input('id', mssql.UniqueIdentifier, params.id); request.input('deletedBy', mssql.Int, params.deletedBy); // 传入当前时间,明确指定类型为DateTime2 request.input('currentTime', mssql.DateTime2, new Date()); const dbResult = await request.query<T>(` UPDATE ${this.tableName} SET deletedBy = @deletedBy, deletedAt = @currentTime WHERE id = @id `); console.log('执行的SQL:', `UPDATE ${this.tableName} SET deletedBy = @deletedBy, deletedAt = @currentTime WHERE id = @id`); return dbResult; } } catch (e) { console.error('deleteById 执行错误:', e); throw new ApiError(500, '删除操作失败'); } }排查表的触发器或默认约束
检查表上有没有触发器,在更新时自动截断deletedAt的时间部分;或者字段有没有设置错误的默认约束(比如DATE(GETDATE()))。执行以下SQL排查:-- 查询表上的触发器 SELECT name FROM sys.triggers WHERE parent_id = OBJECT_ID('你的表名'); -- 查询deletedAt字段的默认约束 SELECT name, definition FROM sys.default_constraints WHERE parent_object_id = OBJECT_ID('你的表名') AND parent_column_id = COLUMNPROPERTY(OBJECT_ID('你的表名'), 'deletedAt', 'ColumnId');如果存在异常的触发器或约束,调整对应的逻辑即可。
升级mssql库版本
你使用的mssql ^6.3.1版本较老,可能存在日期处理的兼容性bug。尝试升级到最新稳定版:npm update mssql
内容的提问来源于stack exchange,提问作者Trijay Sharda
相关产品推荐
相关产品推荐

