Firebird
如何將 Firebird v3 DATEDIFF() 獲取(格式化)為年數、月數和天數?
在 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