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

为何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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 05:17:05