Here I'm just listing some fun with dates, either from single row sql expressions or cool little queries.
select sysdate today ,trunc(sysdate) midnight_today ,trunc(sysdate)+1/86400 one_second ,trunc(sysdate)+2/24 two_hours ,trunc(sysdate)+30/60/24 thirty_minutes ,trunc(sysdate) + interval '2:30' hour to minute two_hour_thirty ,trunc(sysdate,'mm') start_of_month ,trunc(sysdate,'yy') start_of_year ,add_months(trunc(sysdate,'yy'),6) financial_year ,extract(year from sysdate) year_as_number ,to_char(sysdate,'yyyy') year_as_varchar2 ,(sysdate - add_months(sysdate,6)) year to month interval_months ,(Sysdate-(sysdate+2+30/60/24)) day(9) to second interval_daysec ,to_date('2012','yyyy') start_of_month ,last_day(sysdate) end_of_month ,date '2012-02-28' + 1 leap_year ,date '2011-02-28' + 1 non_leap_year ,date '2012-02-28' + interval '1' day only_during_leap_year ,date '1582-10-4' + 1 gregorian_changeover ,to_date('01-01-4712bc','dd-mm-yyyybc') scaliger_start ,to_date(1,'j') easier_scaliger_start ,to_date('31-12-9999','dd-mm-yyyy') end_of_time ,to_date('01-01-98','dd-mm-yy') legacy_wrong_century ,to_date('01-01-98','dd-mm-rr') legacy_better_format from dual;
-- Generate first day of each month select add_months(trunc(sysdate,'yy'),rownum-1) months from dual connect by level <= 12; MONTHS --------------------- 01/01/2012 00:00:00 01/02/2012 00:00:00 01/03/2012 00:00:00 01/04/2012 00:00:00 01/05/2012 00:00:00 01/06/2012 00:00:00 01/07/2012 00:00:00 01/08/2012 00:00:00 01/09/2012 00:00:00 01/10/2012 00:00:00 01/11/2012 00:00:00 01/12/2012 00:00:00 12 rows selected
-- Generate list of this year's weekends select dt from ( select trunc(sysdate,'yy')+rownum-1 dt from dual connect by level <= 365) where to_char(dt,'dy') in ('sat','sun'); DT --------------------- 01/01/2012 00:00:00 07/01/2012 00:00:00 08/01/2012 00:00:00 14/01/2012 00:00:00 ... 23/12/2012 00:00:00 29/12/2012 00:00:00 30/12/2012 00:00:00 105 rows selected
select sysdate@! wtf_is_this from dual;
Further reading on SQL injection with dates
2 comments:
Allow me to perfectionize your 'weekends' query to support non-english databases and leap-years:
select dt
from
(select trunc(sysdate, 'yy')+rownum-1 dt
from dual
connect by level <= 366) -- Leap years
where 1=1
and dt between trunc(dt, 'iw')+5 and trunc(dt, 'iw')+6 -- Only sat/sun
and trunc(dt,'yy') = trunc(sysdate, 'yy')
Ahh, very interesting.
Working in Australia doesn't expose me to that many multi-lingual applications ;-)
Post a Comment