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

如何让node-oracledb返回与Oracle SQLDeveloper一致的SYSTIMESTAMP格式

如何让node-oracledb返回与SQL Developer一致的SYSTIMESTAMP格式

你遇到的差异是因为SQL Developer会自动按照预设规则格式化TIMESTAMP WITH TIME ZONE类型的结果,而node-oracledb默认返回标准ISO格式的时间对象。要得到和SQL Developer完全一致的输出,推荐以下两种解决方式:

方法一:在SQL查询中直接格式化(最可靠)

直接使用Oracle的TO_CHAR函数将systimestamp转换为指定格式的字符串,完全匹配SQL Developer的显示样式:

修改查询语句为:

SELECT TO_CHAR(systimestamp, 'DD-MON-RR HH.MI.SS.FF9 AM TZH:TZM') AS formatted_time FROM dual

对应的完整代码:

const oracledb = require('oracledb')

const dbCredentials = {
    user: "user",
    password: "password",
    connectString: "localhost:1521/xe",
};

async function timeget(dbConfig) {
    let connection;
    try {
        connection = await oracledb.getConnection(dbConfig);
        const result = await connection.execute(
            `SELECT TO_CHAR(systimestamp, 'DD-MON-RR HH.MI.SS.FF9 AM TZH:TZM') AS formatted_time FROM dual`
        );
        
        console.log(result.rows[0][0]); // 输出格式化后的时间字符串
        return result.rows[0][0];
    } catch (err) {
        console.error(err);
    } finally {
        if (connection) {
            try {
                await connection.close();
            } catch (err) {
                console.error(err);
            }
        }
    }
}

timeget(dbCredentials); // 修正原代码变量名大小写错误

格式参数说明:

  • DD-MON-RR:日-英文月份缩写-两位年份(如09-DEC-22)
  • HH.MI.SS.FF9:小时.分钟.秒.9位微秒(如12.36.55.179000000)
  • AM:上午/下午标识
  • TZH:TZM:时区偏移(如-03:00)

方法二:在node-oracledb中手动转换格式

如果不想修改SQL语句,可以在获取结果后手动将ISO格式的时间转换为目标样式,但需要自行处理时区、月份缩写等细节,代码相对繁琐:

// 示例格式化函数(需根据需求完善)
function formatToSQLDevStyle(isoTimestamp) {
    const date = new Date(isoTimestamp);
    const monthAbbrs = ['JAN', 'FEB', 'MAR', 'APR', 'MAY', 'JUN', 'JUL', 'AUG', 'SEP', 'OCT', 'NOV', 'DEC'];
    const day = String(date.getUTCDate()).padStart(2, '0');
    const month = monthAbbrs[date.getUTCMonth()];
    const year = String(date.getUTCFullYear()).slice(-2);
    const hours = date.getUTCHours() % 12 || 12;
    const period = date.getUTCHours() < 12 ? 'AM' : 'PM';
    const minutes = String(date.getUTCMinutes()).padStart(2, '0');
    const seconds = String(date.getUTCSeconds()).padStart(2, '0');
    const milliseconds = String(date.getUTCMilliseconds()).padStart(3, '0').padEnd(9, '0');
    // 时区偏移需根据实际情况计算,此处仅作示例
    const timezone = '-03:00';

    return `${day}-${month}-${year} ${hours}.${minutes}.${seconds}.${milliseconds} ${period} ${timezone}`;
}

// 在查询后使用该函数
// console.log(formatToSQLDevStyle(result.rows[0][0]));

原代码注意事项

  1. 调用timeget时的变量名应为dbCredentials(原代码写为小写dbcredentials)
  2. 函数中return res1未定义res1,建议改为返回实际查询结果

内容的提问来源于stack exchange,提问作者manoel.acmn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 10:51:09