如何在 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 样式,双精度日期列。
如何将日期时间格式化为 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 样式,双精度日期列。