Firebird-時間間隔- 2 個日期之間
我嘗試選擇公司成員的工作期限。
範例:加入日期: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 連接字元串的鬥爭中)。
謝謝和你好! - 搶
*我從來沒有計劃——*匿名者