|
|
Datumfunktioner i Oracle
Kommando | | Exempel | | Beskrivning |
SYSDATE | | SYSDATE | | Returnerar DATE (datum och tid) för servern. |
CURRENT_DATE | | CURRENT_DATE | | Returnerar DATE (datum och tid) för den anslutne användaren (behöver ej vara samma som för servern). |
LOCALTIMESTAMP | | LOCALTIMESTAMP | | Returnerar TIMESTAMP för servern. |
SYSTIMESTAMP | | SYSTIMESTAMP | | Returnerar TIMESTAMP med tidszon från servern. |
CURRENT_TIMESTAMP | | CURRENT_TIMESTAMP | | Returnerar TIMESTAMP med tidszon från den anslutne användaren. |
TO_CHAR | | TO_CHAR(sysdate,'YYYY/MM/DD') | | Returnerar en formatterad sträng utifrån DATE eller TIMESTAMP. |
TO_DATE | | TO_DATE('2004/12/01 10:21','YYYY/MM/DD HH24:MI') | | Konverterar en sträng till ett datum utifrån ett visst givet format. |
TO_TIMESTAMP | | TO_TIMESTAMP('2004/12/01 10:21','YYYY/MM/DD HH24:MI') | | Konverterar en sträng till ett TIMESTAMP utifrån ett visst givet format. |
EXTRACT | | EXTRACT(HOUR FROM current_timestamp) | | Extraherar olika delar av ett DATE eller TIMESTAMP. |
ROUND | | ROUND(TO_DATE('22-JAN-05'),'MONTH') | | Avrundar ett datum upp eller ner. |
TRUNC | | TRUNC(TO_DATE('22-JAN-05'),'MONTH') | | Klipper ett datum. |
NEXT_DAY | | NEXT_DAY(sysdate, 4) | | Returnerar det datum då den givna veckodagen nästa gång inträffar. |
LAST_DAY | | LAST_DAY(sysdate) | | Returnerar datumet för månaden sista dag. |
ADD_MONTHS | | ADD_MONTHS(sysdate, 3) | | Adderar ett antal månader till ett datum och returnerar det nya datumet. |
MONTHS_BETWEEN | | MONTHS_BETWEEN('04-JAN-04','05-JAN-05') | | Returnerar antalet månader mellan två datum. |
|
Funktioner som SYSDATE, CURRENT_DATE, LOCALTIMESTAMP, SYSTIMESTAMP och CURRENT_TIMESTAMP är funktioner utan parametrar. Datatypen TIMESTAMP är ny för Oracle 9i, och det är även alla funktioner som behandlar denna datatyp.
SYSDATE
SYSDATE returnerar DATE (datum och tid) för servern:
SQL> SELECT sysdate, to_char(sysdate,'YYYY-MM-DD HH24:MI') FROM dual;
SYSDATE TO_CHAR(SYSDATE,
---------- ----------------
2005-01-18 2005-01-18 22:17
|
CURRENT_DATE
CURRENT_DATE returnerar DATE (datum och tid) för den anslutne användaren (behöver ej vara samma som för servern):
SQL> SELECT current_date, to_char(current_date,'YYYY-MM-DD HH24:MI') FROM dual;
CURRENT_DA TO_CHAR(CURRENT_
---------- ----------------
2005-01-18 2005-01-18 22:18
|
LOCALTIMESTAMP
Med funktionen LOCALTIMESTAMP hämtar du ett TIMESTAMP. Se exemplet:
SQL> SELECT localtimestamp FROM dual;
LOCALTIMESTAMP
---------------------------------------------------------------------------
2005-01-18 22:38:48,922000
|
SYSTIMESTAMP
Med funktionen SYSTIMESTAMP hämtar du ett TIMESTAMP med serverns tidszon. Se exemplet:
SQL> SELECT systimestamp FROM dual;
SYSTIMESTAMP
---------------------------------------------------------------------------
2005-01-18 22:43:14,223000 +01:00
|
CURRENT_TIMESTAMP
Med funktionen CURRENT_TIMESTAMP hämtar du ett TIMESTAMP med den anslutne användarens tidszon. Se exemplet:
SQL> SELECT current_timestamp FROM dual;
CURRENT_TIMESTAMP
---------------------------------------------------------------------------
2005-01-18 22:39:25,194000 +01:00
|
TO_CHAR
Med funktionen TO_CHAR(datum, format) kan man ta fram en formatterad sträng från ett DATE eller TIMESTAMP. Se exempel:
SQL> SELECT TO_CHAR(sysdate,'YYYY/MM/DD') as str_date
,TO_CHAR(systimestamp,'YYYY/MM/DD') as str_ts
FROM dual;
STR_DATE STR_TS
---------- ----------
2005/01/18 2005/01/18
|
De olika formatsträngarna är:
Format | | Beskrivning |
YY RR YYYY RRRR YEAR | | År i kort form, lång form och beskrivning. |
Q | | Kvartal |
MM MON MONTH | | Olika former av måndad. |
WW W | | 1-52 vecka per år, 1-4 vecka per månad. |
D DD DY DAY | | 1-7 veckodag, 1-31 månadsdag, 1-366 dag på året, dagens namn. |
HH HH12 HH24 | | Timmar |
MI | | Minuter |
SS SSSSS | | Sekunder |
SS.FF1 till SS.FF9 | | Sekunder med olika många decimaler (endast för TIMESTAMP). |
SQL> SELECT sysdate, TO_CHAR(sysdate,'YY RR YYYY RRRR YEAR: Q: MM MON MONTH: WW W') as format1 FROM dual;
SYSDATE FORMAT1
---------- -------------------------------------------------------------------------------------
2005-01-18 05 05 2005 2005 TWO THOUSAND FIVE: 1: 01 JAN JANUARI : 03 3
SQL> SELECT sysdate, TO_CHAR(sysdate,'D DD DY DAY: HH HH12 HH24: MI: SS SSSSS') as format1 FROM dual;
SYSDATE FORMAT1
---------- ----------------------------------------
2005-01-18 2 18 TIS TISDAG : 11 11 23: 40: 47 85247
|
Endast TIMESTAMP kan utnyttja formatet SS.FF#. Se nedan:
SQL> SELECT systimestamp, TO_CHAR(systimestamp,'SS SS.FF3') as format1 FROM dual;
SYSTIMESTAMP FORMAT1
--------------------------------------------------------------------------- ---------------
2005-01-18 23:44:54,033000 +01:00 54 54.033
|
TO_DATE
Med TO_DATE(sträng, format) kan man skapa ett DATE utifrån en sträng. Se exempel:
SQL> SELECT TO_DATE('2004/12/01 10:21','YYYY/MM/DD HH24:MI') FROM dual;
TO_DATE('2
----------
2004-12-01
|
Samma formatsträngar används som för TO_CHAR.
TO_TIMESTAMP
Med TO_TIMESTAMP(sträng, format) kan man skapa ett TIMESTAMP utifrån en sträng. Se exempel:
SQL> SELECT TO_TIMESTAMP('2004/12/01 10:21','YYYY/MM/DD HH24:MI') FROM dual;
TO_TIMESTAMP('2004/12/0110:21','YYYY/MM/DDHH24:MI')
---------------------------------------------------------------------------
2004-12-01 10:21:00,000000000
|
Samma formatsträngar används som för TO_CHAR.
EXTRACT
Med kommandot EXTRACT kan man komma åt olika delar av ett DATE eller TIMESTAMP. EXTRACT är ny för Oracle 9i. EXTRACT har följande syntax:
EXTRACT( format FROM {datum | timestamp})
|
Vi kan extrahera delar från timestamp="2005-01-18 21:30:41,024000 +01:00" genom att sätta format till följande värden:
Format | | Beskrivning |
YEAR | | =2005 |
MONTH | | =1 |
DAY | | =18 |
HOUR | | =20 |
MINUTE | | =30 |
SECOND | | =41,024 |
TIMEZONE_HOUR | | 1 |
TIMEZONE_MINUTE | | 0 |
TIMEZONE_REGION | | UNKNOWN |
TIMEZONE_ABBR | | UNK |
Såhär ser i så fall SELECT-satsen ut:
SQL> SELECT current_timestamp
,EXTRACT(YEAR FROM current_timestamp) as year
,EXTRACT(MONTH FROM current_timestamp) as mon
,EXTRACT(DAY FROM current_timestamp) as day
,EXTRACT(HOUR FROM current_timestamp) as hour
,EXTRACT(MINUTE FROM current_timestamp) as min
,EXTRACT(SECOND FROM current_timestamp) as sec
,EXTRACT(TIMEZONE_HOUR FROM current_timestamp) as tzh
,EXTRACT(TIMEZONE_MINUTE FROM current_timestamp) as tzmin
,EXTRACT(TIMEZONE_REGION FROM current_timestamp) as tzreg
,EXTRACT(TIMEZONE_ABBR FROM current_timestamp) as tzabb
FROM dual;
CURRENT_TIMESTAMP YEAR MON DAY HOUR MIN SEC TZH TZMIN TZREG TZABB
----------------------------------- ----- ----- ----- ----- ----- ---------- ----- ----- ------------ ----------
2005-01-18 21:30:41,024000 +01:00 2005 1 18 20 30 41,024 1 0 UNKNOWN UNK
|
Även strängar är godkända för formattering, men då med nyckelordet DATE eller TIME före:
SQL> SELECT EXTRACT(MONTH FROM DATE '2005-11-10') as mon
,EXTRACT(MINUTE FROM TIME '22:54:01') as min
FROM dual;
MON MIN
----- -----
11 54
|
ROUND
Med ROUND(date, format) kan du avrunda ett datum upp eller ner på den nivå som bestäms av format. Om inget format ges avrundas DATE till närmaste datum. Ett exempel:
SQL> SELECT to_char(sysdate, 'YYYY-MM-DD HH24:MI') as the_date
,to_char(ROUND(sysdate), 'YYYY-MM-DD HH24:MI') as default_val
,to_char(ROUND(sysdate,'CC'), 'YYYY-MM-DD HH24:MI') as century
,to_char(ROUND(sysdate,'YEAR'), 'YYYY-MM-DD HH24:MI') as year
,to_char(ROUND(sysdate,'MONTH'), 'YYYY-MM-DD HH24:MI') as mom
,to_char(ROUND(sysdate,'DDD'), 'YYYY-MM-DD HH24:MI') as day
,to_char(ROUND(sysdate,'HH24'),'YYYY-MM-DD HH24:MI') as hour
FROM dual;
THE_DATE DEFAULT_VAL CENTURY YEAR MOM DAY HOUR
---------------- ---------------- ---------------- ---------------- ---------------- ---------------- ----------------
2005-01-18 22:10 2005-01-19 00:00 2001-01-01 00:00 2005-01-01 00:00 2005-02-01 00:00 2005-01-19 00:00 2005-01-18 22:00
|
Vi såg i exemplet att ROUND avrundar till närmaste värde.
TRUNC
Med TRUNC(date, format) kan du klippa av ett datum på den nivå som bestäms av format. Om inget format ges klipps DATE till närmaste datum. Ett exempel:
SQL> SELECT to_char(sysdate, 'YYYY-MM-DD HH24:MI') as the_date
,to_char(TRUNC(sysdate), 'YYYY-MM-DD HH24:MI') as default_val
,to_char(TRUNC(sysdate,'CC'), 'YYYY-MM-DD HH24:MI') as century
,to_char(TRUNC(sysdate,'YEAR'), 'YYYY-MM-DD HH24:MI') as year
,to_char(TRUNC(sysdate,'MONTH'), 'YYYY-MM-DD HH24:MI') as mom
,to_char(TRUNC(sysdate,'DDD'), 'YYYY-MM-DD HH24:MI') as day
,to_char(TRUNC(sysdate,'HH24'),'YYYY-MM-DD HH24:MI') as hour
FROM dual;
THE_DATE DEFAULT_VAL CENTURY YEAR MOM DAY HOUR
---------------- ---------------- ---------------- ---------------- ---------------- ---------------- ----------------
2005-01-18 22:13 2005-01-18 00:00 2001-01-01 00:00 2005-01-01 00:00 2005-01-01 00:00 2005-01-18 00:00 2005-01-18 22:00
|
NEXT_DAY
NEXT_DAY(datum, veckodag) returnerar det datum då den givna veckodagen nästa gång inträffar:
SQL> SELECT NEXT_DAY(sysdate,4) FROM dual;
NEXT_DAY(S
----------
2005-01-20
|
LAST_DAY
LAST_DAY(datum) returnerar datumet för månadens sista dag bestämt av datum:
SQL> SELECT LAST_DAY(sysdate) FROM dual;
LAST_DAY(S
----------
2005-01-31
|
ADD_MONTHS
ADD_MONTHS(datum, nr) returnerar datum med nr månader adderat:
SQL> SELECT ADD_MONTHS(sysdate, 3) FROM dual;
ADD_MONTHS
----------
2005-04-19
|
MONTHS_BETWEEN
MONTHS_BETWEEN returnerar antalet månader mellan två datum:
SQL> SELECT MONTHS_BETWEEN('04-JAN-04','05-JAN-05') FROM dual;
MONTHS_BETWEEN('04-JAN-04','05-JAN-05')
---------------------------------------
-12,032258
|
|
| |
|