Firebird

如何將 Firebird v3 DATEDIFF() 獲取(格式化)為年數、月數和天數?

  • December 14, 2019

在 Firebird 3中,我可以DATEDIFF()使用或來分別獲取年數、月數天數。YEAR``MONTH``DAY

我需要一種方法來獲得一年、幾個月幾天的時間。

例如:412 天應表示為1 年 1 月 16 天

你看起來像這樣:

declare @d1 datetime, @d2 datetime, @y int, @m int, @d int
set @d1 = '2018-10-26'
set @d2 = '2019-12-12'

set @y = datediff(year, @d1, @d2)
set @m = datediff(month, dateadd(year, @y, @d1), @d2) 
if dateadd(month, @m, dateadd(year, @y, @d1)) > @d2 set @m = @m - 1

set @d = datediff(day, dateadd(month, @m, dateadd(year, @y, @d1)), @d2)
print cast(@y as nvarchar) + ' year(s) ' + cast(@m as nvarchar) + ' month(s) and ' + cast(@d as nvarchar) + ' day(s)'

結果:

1 年 1 個月 16 天

這可能是在您的應用程序的表示層中更好地解決的問題。但是,在 Firebird 3 中,您可以定義一個為您執行此操作的過程函式:

create function period_between(start_date date, end_date date)
 returns varchar(100)
as
declare temp_date date;
declare years smallint;
declare months smallint;
declare days smallint;
begin
   -- swap dates if necessary
   if (start_date > end_date) then
   begin
       temp_date = start_date;
       start_date = end_date;
       end_date = temp_date;
   end

   -- calculate number of years
   years = datediff(year from start_date to end_date);
   temp_date = dateadd(years year to start_date);
   if (temp_date > end_date) then
   begin
       years = years - 1;
       temp_date = dateadd(-1 year to temp_date);
   end

   -- calculate number of months
   months = datediff(month from temp_date to end_date);
   temp_date = dateadd(months month to temp_date);
   if (temp_date > end_date) then
   begin
       months = months - 1;
       temp_date = dateadd(-1 month to temp_date);
   end

   -- calculate number of days
   days = datediff(day from temp_date to end_date);

   return '' || years || ' year(s) ' || months || ' month(s) and ' || days || ' day(s)';
end

這類似於 CR241 的解決方案,不同之處在於它採用 Firebird 語法,並且它使用局部變數作為中間值。

你可以像這樣呼叫這個函式:

select period_between(date'2018-10-26', date'2019-12-12') from rdb$database

引用自:https://dba.stackexchange.com/questions/255526