如何将日期时间格式化为ISO 8601?
据我所知,Firebird DB中没有内置函数可以将日期或时间戳格式化为yyyy-MM-ddTHH:mm:ss.fffff
(ISO8601标准表示)。
答案 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风格的双精度日期列。