如何在Firebird数据库中将日期时间格式化为ISO8601标准?
如何在Firebird中将日期时间格式化为ISO 8601标准?
嘿,正好我之前也碰到过Firebird里这个需求!确实它没有直接输出yyyy-MM-ddTHH:mm:ss.fffff这种带五位微秒的ISO 8601格式的内置函数,不过咱们可以自己动手实现,两种实用方法分享给你:
方法一:创建自定义PSQL函数(推荐复用场景)
如果需要多次使用这个格式转换,最好创建一个可复用的自定义函数。下面是亲测有效的函数代码:
CREATE OR ALTER FUNCTION TO_ISO8601(ts TIMESTAMP) RETURNS VARCHAR(23) AS BEGIN RETURN -- 拼接日期部分,确保单数字补零 LPAD(CAST(EXTRACT(YEAR FROM ts) AS VARCHAR), 4, '0') || '-' || LPAD(CAST(EXTRACT(MONTH FROM ts) AS VARCHAR), 2, '0') || '-' || LPAD(CAST(EXTRACT(DAY FROM ts) AS VARCHAR), 2, '0') || 'T' || -- 拼接时间部分 LPAD(CAST(EXTRACT(HOUR FROM ts) AS VARCHAR), 2, '0') || ':' || LPAD(CAST(EXTRACT(MINUTE FROM ts) AS VARCHAR), 2, '0') || ':' || LPAD(CAST(EXTRACT(SECOND FROM ts) AS VARCHAR), 2, '0') || '.' || -- 取五位微秒(Firebird的TIMESTAMP是6位精度,这里除以10取整) LPAD(CAST(TRUNC(EXTRACT(MICROSECOND FROM ts)/10) AS VARCHAR), 5, '0'); END;
创建好之后,直接调用就行:
SELECT TO_ISO8601(CURRENT_TIMESTAMP) FROM RDB$DATABASE;
方法二:直接在查询中拼接(适合临时场景)
如果只是偶尔用一次,不想创建函数,直接在查询里拼接字段就行,逻辑和上面的函数一致:
SELECT LPAD(CAST(EXTRACT(YEAR FROM your_timestamp_column) AS VARCHAR), 4, '0') || '-' || LPAD(CAST(EXTRACT(MONTH FROM your_timestamp_column) AS VARCHAR), 2, '0') || '-' || LPAD(CAST(EXTRACT(DAY FROM your_timestamp_column) AS VARCHAR), 2, '0') || 'T' || LPAD(CAST(EXTRACT(HOUR FROM your_timestamp_column) AS VARCHAR), 2, '0') || ':' || LPAD(CAST(EXTRACT(MINUTE FROM your_timestamp_column) AS VARCHAR), 2, '0') || ':' || LPAD(CAST(EXTRACT(SECOND FROM your_timestamp_column) AS VARCHAR), 2, '0') || '.' || LPAD(CAST(TRUNC(EXTRACT(MICROSECOND FROM your_timestamp_column)/10) AS VARCHAR), 5, '0') AS iso_8601_datetime FROM your_table;
小提醒
Firebird的TIMESTAMP类型本身支持微秒级精度(6位),这里我们取前五位是为了匹配你要的fffff格式;如果需要6位微秒的ISO格式,把微秒部分的TRUNC(EXTRACT(...)/10)改成EXTRACT(MICROSECOND FROM ts)就行,同时把返回的VARCHAR长度调整为24。
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

