如何让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]));
原代码注意事项
- 调用
timeget时的变量名应为dbCredentials(原代码写为小写dbcredentials) - 函数中
return res1未定义res1,建议改为返回实际查询结果
内容的提问来源于stack exchange,提问作者manoel.acmn
相关产品推荐
相关产品推荐

