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
Обратите внимание, что я пропустил доли секунды, поскольку они приведут к дополнительным головным болям.