用Oracle日期函式解決查詢難題

2021-05-14 09:13:28 字數 1846 閱讀 8019

最近,筆者參與開發了乙個資訊管理系統,系統以oracle為資料庫後台,p

owerbuilder

8為開發工具。

筆者負責開發的查詢模組中需要乙個全域性函式,該函式能查詢某年、某月、某職工在某個城市的工作總天數,查詢僅涉及乙個表ryqxb,該錶記錄了人員去向,表結構如下:pepoleid:職工編碼,city:所工作的城市,qssj:工作起始時間,zzsj:工作終止時間。查詢方案似乎很簡單:

首先,每次工作總天數=工作終止日期-工作起始日期+1。

然後,利用sum函式,對符合查詢條件的每次按次工作總天數求和,得出當月工作天數。

仔細分析,筆者發現這個查詢非常複雜,查詢涉及的sql語句需要同時考慮以下二種情況: 1

、某職工在某城市工作起始日期和終止日期屬於同一年同一月,且在要查詢的年月範圍內,計算可直接採用前面的查詢方案。比如:某職工從2023年7月5日至2023年7月15日,在某城市工作,則7月份的總工作天數為:7月15日減7月5日加1,總共11天。 2

、某職工在某城市工作起始日期和終止日期不屬於同一月,且要查詢的年月在工作起止日期的範圍內,計算總工作天數不能完全以表中記錄的起止日期為計算依據。比如:某職工2023年12月25日至2023年2月20日在某城市工作。 2023年12月的總工作天數為:2023年12

月31日

減2005

年12月25日加1,總共7天。2023年1月的總工作天數為:2023年1月31日減2023年1月1日加1總共31天。2023年2月的總工作天數為:2023年2月20日減2023年2月1日加1總共21天。這種情況如何確定計算依據呢?根據這個例子,做出示意圖:

仔細分析該圖,不難發現規律:計算總天數所依據的起始日期為表中記錄的起始日期和查詢年月第一天之間的最大者,計算總天數所依據的終止日期為表中記錄的終止日期和查詢年月最後一天之間的最小者。

該規律對第一種情況同樣有效,但要利用該規律,必須有資料庫管理系統的支援,oracle提供了相關的sql函式: 1

、last_day(d):返回包含了日期引數的月份的最後一天的日期 2

、greatest(d1,d2…dn)給出的日期列表中最後的日期 3

、least(d1,k2…dn)給出的日期列表中最早的日期

利用這三個日期函式,筆者僅用一條較簡單的sql語句就完成了函式,以下是源**: //

函式名:gf_getmonthdays

//函式功能:返回某年某月某個職工在某城市的工作總天數 //

函式引數:as_year年,as_month月,as_id職工id,as_city城市名

long gf_getmonthdays(string as_year,stringas_month,string as_id, string as_city)

string ls_firstdate

string ls_yearmonth

long

ll_days

ls_firstdate=as_year+'-'+trim(as_month)+'-01'

ls_yearmonth=as_year+'-'+trim(as_month)

selectsum(least(t.zzsj,last_day(to_date(:ls_firstdate,'yyyy-mm-dd'))) -greatest(to_date(:ls_firstdate,'yyyy-mm-dd'),t.qssj)+1) asdays

into :ll_days fromryqxb t

where t.pepoleid=:as_id and

t.city=:as_city

and(to_char(t.zzsj,'yyyy-mm')>=:ls_yearmonth

andto_char(t.qssj,'yyyy-mm')<=:ls_yearmonth);

用Oracle日期函式解決查詢難題

筆者負責開發的查詢模組中需要乙個全域性函式,該函式能查詢某年 某月 某職工在某個城市的工作總天數,查詢僅涉及乙個表ryqxb,該錶記錄了人員去向,表結構如下 pepoleid 職工編碼,city 所工作的城市,qssj 工作起始時間,zzsj 工作終止時間。查詢方案似乎很簡單 然後,利用sum函式,...

oracle 日期查詢

1.string hql select substr to char create time,yyyy mm dd hh24 mm ss 1,10 count createtime from sitebean where to char createtime,yyyy mm dd to char t...

Oracle 日期查詢

例如 select from c where cdate to date 2010 10 14 14 00 00 yyyy mm dd hh24 mi ss select from mytable where to char install date,yyyymmdd 20050101 select...