Date

Firebird-時間間隔- 2 個日期之間

  • April 15, 2016

我嘗試選擇公司成員的工作期限。

範例:加入日期:01.01.2001 今天:27.02.2014 現在,我想要這個:13 年 1 個月 27 天

我有一個適用於 MSSQL 的語句,但我無法將其轉換為 firebird-SQL。

有人可以幫助我嗎?

謝謝

埃里克

相對綠色的火鳥 n00b 這裡有一個公平的 PostgreSQL 背景,雖然專業的 GIS 工作主要集中在數據庫設計和採購/清理/製作空間多源數據集(通常質量可疑),然後查詢可映射的結果作為答案到特定的位置謎語。因此,工具箱在管理/優化/第 3 方應用程序設置等方面很輕。在接下來的幾週內,您可能(錯誤,將會)看到我提出的一些 Firebird 特定問題。提前致謝!對這個稍微老一點的 Firebird 問題進行了嘗試,以感受一下日期處理和連接的新感覺。進行了比預期更多的調整和測試,我的涉獵可能不是最有效/最優雅的解決方案,但是,假設表員工中存在列****join_date,這將起作用:

SELECT Y ||' Years, '|| M ||' Months, and '|| D ||' Days'
FROM
(
SELECT
CASE WHEN datediff(year, join_date, current_date) <> datediff(day, join_date, current_date)/365
THEN datediff(year, join_date, current_date)-1
ELSE datediff(year, join_date, current_date)
END as Y,
CASE WHEN datediff(year, join_date, current_date) <> datediff(day, join_date, current_date)/365
AND datediff(day, dateadd(month, datediff(month, join_date, current_date), join_date), current_date)<0
THEN datediff(month, dateadd(year, datediff(year, join_date, current_date)-1, join_date), current_date)-1
WHEN datediff(year, join_date, current_date) <> datediff(day, join_date, current_date)/365
AND datediff(day, dateadd(month, datediff(month, join_date, current_date), join_date), current_date)>=0
THEN datediff(month, dateadd(year, datediff(year, join_date, current_date)-1, join_date), current_date)
WHEN datediff(year, join_date, current_date) = datediff(day, join_date, current_date)/365
AND datediff(day, dateadd(month, datediff(month, join_date, current_date), join_date), current_date)<0
THEN datediff(month, dateadd(year, datediff(year, join_date, current_date), join_date), current_date)-1
ELSE datediff(month, dateadd(year, datediff(year, join_date, current_date), join_date), current_date)
END as M,
CASE WHEN datediff(day, dateadd(month, datediff(month, join_date, current_date), join_date), current_date)<0
THEN datediff(day, dateadd(month, datediff(month, join_date, current_date)-1, join_date), current_date)
ELSE datediff(day, dateadd(month, datediff(month, join_date, current_date), join_date), current_date)
END as D
FROM employees
)

當很明顯時,子查詢對我有條件:a)年和月的計算不考慮整個日期;b) 無論事件的順序如何,日期減法都將愉快地返回負值。

年/月/日 範例:datediff() 在檢索 31.12.2015 和 1.1.2016 之間的天數、月數或年數時返回值 1。

負值範例:當我使用以下方法計算天數減去整個月包含的天數時,大約 69% 的測試日期值小於零:

SELECT datediff(day, dateadd(month, datediff(month, date_column, current_date), date_column), current_date) as D FROM date_table

如果可以接受將 365 天替換為一年,我們可以簡化子查詢。這個技巧適用於我的測試數據,但可能會在更廣泛的日期範圍內引發陷阱。簡化的查詢如下所示:

SELECT Y ||' Years, '|| M ||' Months, and '|| D ||' Days'
FROM
(
SELECT
datediff(day, join_date, current_date)/365 as Y,
CASE WHEN datediff(day, dateadd(month, datediff(month, join_date, current_date), join_date), current_date)<0
THEN datediff(month, dateadd(year, datediff(day, join_date, current_date)/365, join_date), current_date)-1
ELSE datediff(month, dateadd(year, datediff(day, join_date, current_date)/365, join_date), current_date)
END as M,
CASE WHEN datediff(day, dateadd(month, datediff(month, join_date, current_date), join_date), current_date)<0
THEN datediff(day, dateadd(month, datediff(month, join_date, current_date)-1, join_date), current_date)
ELSE datediff(day, dateadd(month, datediff(month, join_date, current_date), join_date), current_date)
END as D
FROM employees
)

如果我搞砸了,或者我使用了糟糕/過度勞累的邏輯,那就大喊大叫。希望它在某些時候對某人有幫助!留意新的 Firebird 問題(可能已經陷入與不會失去的 JDBC 連接字元串的鬥爭中)。

謝謝和你好! - 搶

*我從來沒有計劃——*匿名者

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