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

时间:2018-05-01 07:43:52

标签: firebird iso8601

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

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

3 个答案:

答案 0 :(得分:2)

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

请注意,我遗漏了小数秒,因为这会引入额外的麻烦。

答案 1 :(得分:0)

这个很丑,但确实有效。我希望在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

答案 2 :(得分:0)

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风格的双精度日期列。