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