Как отформатировать / конвертировать datetime в ISO8601 в БД Firebird? - PullRequest
0 голосов
/ 01 мая 2018

Как мне отформатировать дату и время в ISO 8601?

Насколько мне известно, в Firebird DB нет встроенной функции для форматирования даты или отметки времени как yyyy-MM-ddTHH:mm:ss.fffff (стандартное представление ISO8601).

Ответы [ 2 ]

0 голосов
/ 01 мая 2018

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

Обратите внимание, что я пропустил доли секунды, поскольку они приведут к дополнительным головным болям.

0 голосов
/ 01 мая 2018

Это безобразно, но работает. Хотелось бы, чтобы в 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

...