如何在 Firebird DB 中将日期时间格式化/转换为 ISO8601?

how to format / convert datetime to ISO8601 in Firebird DB?

如何将日期时间格式化为 ISO 8601?

据我所知,Firebird DB 中没有内置函数可以将日期或时间戳格式化为 yyyy-MM-ddTHH:mm:ss.fffff(ISO8601 标准表示)。

这个很丑但很管用。我希望 Firebird 有一个内置的 ISO8601 功能。

substring(replace
                (replace
                       (replace
                         (cast(cast(TARGETDATE as timestamp) as varchar(24)
                        ), '-', '') 
                 , ' ', 'T')
           , ':', '') from 1 for 15) as TARGETDATE

输入:2016.12.19,14:07:56 -> 输出:20161219T140756

Firebird 没有内置函数来执行此操作。并且转换为字符串将始终应用特定于语言环境的格式。现在最好的方法是根本不在数据库中执行,而是将其留给应用程序中的表示层。

如果你真的需要在数据库中,那么一个稳定的方法是:

extract(year from ts) || 
'-' || lpad(extract(month from ts), 2, '0') || 
'-' || lpad(extract(day from ts), 2, '0') || 
'T' || lpad(extract(hour from ts), 2, '0') || 
':' || lpad(extract(minute from ts), 2, '0') || 
':' || lpad(extract(second from ts), 2, '0')

如果您使用的是 Firebird 3,那么您可以将其包装在您自己的函数中:

create function iso8601timestamp(ts timestamp) returns varchar(20)
as
begin
    return extract(year from ts) || 
        '-' || lpad(extract(month from ts), 2, '0') || 
        '-' || lpad(extract(day from ts), 2, '0') || 
        'T' || lpad(extract(hour from ts), 2, '0') || 
        ':' || lpad(extract(minute from ts), 2, '0') || 
        ':' || lpad(extract(second from ts), 2, '0');
end

请注意,我省略了小数秒,因为那会带来额外的麻烦。

Extract(second) -函数将在 Firebird2 中为您提供小数秒。

https://firebirdsql.org/refdocs/langrefupd20-extract.html

extract(second from ts)

Leftpadding 看起来不会很漂亮。如果秒 < 10,数字后面会有一个点。 如果你有 Firebird 2.x 并且想从 DELPHI 风格的双精度时间戳转换,你可以使用这个(秒后你将有 4 位数字,这是我能得到的最准确的数字):

select 
extract(year from ts'1899-12-30 00:00' + T) ||'-' ||
lpad(extract(month from ts'1899-12-30 00:00' + T),2, '0') || '-' ||
lpad(extract(day from ts'1899-12-30 00:00' + T),2, '0') || 'T' ||
lpad(extract(hour from ts'1899-12-20 00:00' + T),2, '0') || ':' ||
lpad(extract(minute from ts'1899-12-20 00:00' + T),2, '0') || ':' ||
lpad(extract(second from ts'1899-12-20 00:00' + T),7, '0')

T 是您的 Delphi 样式,双精度日期列。