You are on page 1of 16

WEEK-2A

WEEK- 2 / A:
DATE AND
DATE FUNCTIONS

TO_CHAR
TO_DATE
MONTHS_BETWEEN
ADD_MONTHS
LAST_DAY
LEAST
NEXT_DAY
EXTRA
TO CREATE TABLE
SQL> CREATE TABLE MyFirstTable( ID NUMBER, NAME VARCHAR2(10) ) ;

TO INSERT RECORDS
SQL> INSERT INTO MyFirstTable VALUES(1, ’MARAT’);
SQL> INSERT INTO MyFirstTable VALUES(2, ’ALIYA’);

SQL> SELECT * FROM MyFirstTable;

ID NAME
-------------------------
1 MARAT
2 ALIYA
SQL> CREATE TABLE MySecondTable( ID NUMBER,
NAME VARCHAR2(10) ,
DOB DATE) );

SQL> INSERT INTO MySecondTable VALUES(1, ’NURLAN’,’11-FEB-1985’);


SQL> INSERT INTO MySecondTable VALUES(2, ’SAMAT’,’5-JAN-1986’);

SQL> SELECT * FROM MySecondTable;

ID NAME DOB
------------------------------------------------------
1 NURLAN 11-FEB-1985
2 SAMAT 05-JAN-1986
DATE
Overview
Oracle supports both date and time.Rather than using two separate entities, date and
time, Oracle only uses one, DATE.

The DATE type is stored in a special internal format that includes not just the month,
day, and year, but also the hour, minute, and second.

For example, the following SQL statement creates a relation with an attribute of type
DATE:

SQL> CREATE TABLE X(B date);

SQL> INSERT INTO X VALUES(’01-APR-98’) ;


DATE Format
When a DATE value is displayed, Oracle must first convert that value from the special internal
format to a printable string. The conversion is done by a function TO_CHAR, according to a DATE
format.

Oracle's default format for DATE is "DD-MON-YY". Therefore, when you issue the query

SELECT * from X; you will see something like:


B
---------
01-APR-98

Whenever a DATE value is displayed, Oracle will call TO_CHAR automatically with the default
DATE format.

However, you may override the default behavior by calling TO_CHAR explicitly with your own DATE
format.

For example,
SELECT TO_CHAR(B, 'YYYY/MM/DD') AS B FROM X; returns the result:

B
------------------
1998/04/01
The general usage of TO_CHAR is: TO_CHAR(<date>, '<format>')
where the <format> string can be formed from over 40 options. Some of the more
popular ones include:

MO Numeric month (e.g., 07)


MON Abbreviated month name (e.g., JUL)
MONTH Full month name (e.g., JULY)
DD Day of month (e.g., 24)
DY Abbreviated name of day (e.g., FRI)
DAY Full day name (e.g., SATURDAY)
YYYY 4-digit year (e.g., 1998)
YY Last 2 digits of the year (e.g., 98)
AM or PM Meridian indicator
HH Hour of day (1-12)
HH24 Hour of day (0-23)
MI Minute (0-59)
SS Second (0-59)
You have just learned how to output a DATE value using TO_CHAR.

Now what about inputting a DATE value?


This is done through a function called TO_DATE, which converts a string to a DATE
value, again according to the DATE format.

Normally, you do not have to call TO_DATE explicitly:

Whenever Oracle expects a DATE value, it will automatically convert your input string
using TO_DATE according to the default DATE format "DD-MON-YY". For example, to
insert a tuple with a DATE attribute, you can simply type:

SQL> insert into x values('31-MAY-98');

Alternatively, you may use TO_DATE explicitly:

SQL> INSERT INTO X VALUES(TO_DATE('1998/05/31:12:00:00AM',


'yyyy/mm/dd:hh:mi:ssam'));

The general usage of TO_DATE is:

TO_DATE(<string>, '<format>')

where the <format> string has the same options as in TO_CHAR.


EXTRA
You can change the default DATE format of Oracle from "DD-MON-YY"
to something you like by issuing the following command in sqlplus:

SQL> ALTER SESSION SET NLS_DATE_FORMAT='<my_format>';

The change is only valid for the current sqlplus session.

SQL> ALTER SESSION SET NLS_DATE_FORMAT=‘DD-MM-YY’ ;

SQL> SELECT * FROM X;


B
------------
01-04-98

SQL> ALTER SESSION SET NLS_DATE_FORMAT=‘DD-MON-YY’ ;


SQL> SELECT * FROM X;
B
------------
01-APR-98
TABLE : STAFF
ID NAME DOB DEPARTMENT SALARY
1 NURLAN 13 JUN 1978 CANTEEN 500

2 ASEL 4 JAN 1979 CAFE 800

3 BAKIT 12 FEB 1977 LIBRARY 1000

4 BAURJAN 4 MAY 1976 LIBRARY 750

5 SERIK 6 APR 1979 CAFE 600

6 AYNUR 7 OCT 1980 FOLDERCENTER 500


7 ELENA 11 DEC 1974 FOLDERCENTER 600

SQL> Alter Session set nls_date_format=‘dd-mm-yyyy’

SQL> Alter Session set nls_date_format=‘dd-mon-yyyy’


SYSDATE : Current Date

SQL> SELECT SYSDATE FROM DUAL ;

SYSDATE
----------------
25-JAN-10

ADD_MONTHS : Add A Month To A Date

SQL> SELECT ADD_MONTHS(SYSDATE,2) FROM DUAL;

ADD_MONTHS(SYSDATE,2)
-----------------------------------------
25-MAR-10

MONTHS_BETWEEN : Returns The Months Separating Two Dates

SQL>SELECT MONTHS_BETWEEN(SYSDATE,'01-JAN-2009') FROM DUAL;

MONTHS_BETWEEN(SYSDATE,'01-JAN-2009')
-------------------------------------------------------------------
12.33
NEXT_DAY : Date of next specified date following a date.
Options are SUN, MON, TUE, WED, THU, FRI, SAT
SQL> SELECT NEXT_DAY(SYSDATE,’WED’) AS RESULT FROM DUAL ;

RESULT
----------------
27-JAN-10

LAST_DAY : Returns the last day of a month.

SQL> SELECT LAST_DAY(’05-FEB-2010’) AS RESULT FROM DUAL;

RESULT
----------------
28-FEB-10

LEAST : Return the Earliest Date.


SQL> SELECT LEAST(SYSDATE,'26-JAN-2010','01-JAN-2010') AS RESULT FROM DUAL;

RESULT
---------------
01-JAN-10
STUFF

ID NAME DOB DEPARTMENT SALARY


1 NURLAN 13 JUN 1978 CANTEEN 500

2 ASEL 4 JAN 1979 CAFE 800

3 BAKIT 12 FEB 1977 LIBRARY 1000

4 BAURJAN 4 MAY 1976 LIBRARY 750

5 SERIK 6 APR 1979 CAFE 600

6 AYNUR 7 OCT 1980 FOLDERCENTER 500


7 ELENA 11 DEC 1974 FOLDERCENTER 600

How can we find the age of them ?

SELECT TO_CHAR(SYSDATE,'YYYY') - TO_CHAR(DOB,'YYYY') AS AGE FROM EMP;

List month only

SELECT TO_CHAR(DOB,’MONTH’) FROM STUFF;

List YEAR only

SELECT TO_CHAR(DOB,’YEAR’) FROM STUFF;


Write an SQL statement to answer the following questions.
1- How many months have staff worked until now?
2- 20 days later, what will be the date ?
3- 5 months later, what will be the date ?
4- Which day have they started to work ?(EMP) ( day as number e.g. 21)
5- Which day have they started to work ? (EMP) ( full day name e.g. SATURDAY )
6-What time is it ? 12:01:30PM
Write an SQL statements which returns,
7- Employee name and only months of hiredate.
8- Current day as a number. 25
9- Current day as a full name. MONDAY
10- Current month as a full name. JANUARY
11- Current date as format 2010-MONDAY-JANUARY
12- Current hour and minute. 12:20
13- Current meridian indicator . PM
14- Last day of February,1996 . 29-FEB-96
15- Current year . TWENTY TEN
16- The next SUNDAY ? 31-JAN-10
17- The next Friday . 29-JAN-10
18- Five days later . 30-JAN-10

19-Change date format of session as 2010-01-26

20-Change date format of session as 2010-MONDAY

21- Create the stuff table below.


STUFF
ID NAME DOB DEPARTMENT SALARY
1 NURLAN 13 JUN 1978 CANTEEN 500

2 ASEL 4 JAN 1979 CAFE 800

3 BAKIT 12 FEB 1977 LIBRARY 1000

4 BAURJAN 4 MAY 1976 LIBRARY 750

5 SERIK 6 APR 1979 CAFE 600

6 AYNUR 7 OCT 1980 FOLDERCENTER 500


7 ELENA 11 DEC 1974 FOLDERCENTER 600

22-Add 10 or more records.


SOLUTIONS

1) select TRUNC(MONTHS_BETWEEN(SYSDATE,HIREDATE)) FROM EMP;


2) select TO_CHAR(SYSDATE-20,'DAY') FROM EMP;
3) select ADD_MONTHS(SYSDATE,5) FROM EMP;
4) select TO_CHAR(HIREDATE,'DD') FROM EMP;
5) select TO_CHAR(HIREDATE,'DAY') FROM EMP;
6) select TO_CHAR(SYSDATE,'HH:MI:SS PM') FROM EMP;
7) select ENAME,TO_CHAR(HIREDATE,'MONTH') FROM EMP;
8) select TO_CHAR(SYSDATE,'DD') FROM EMP;
9) select TO_CHAR(SYSDATE,'DAY') FROM EMP;
10)select TO_CHAR(SYSDATE,'MONTH') FROM EMP;
11)select TO_CHAR(SYSDATE,'YYYY-DAY-MONTH') FROM EMP;
12)select TO_CHAR(SYSDATE,'HH:MI') FROM EMP;
13)select TO_CHAR(SYSDATE,'PM') FROM EMP;
14)select TO_CHAR(LAST_DAY('01-02-1996'),'DD-MON-YY') FROM EMP;
15)select TO_CHAR(SYSDATE,'YEAR') FROM EMP;
16)select TO_CHAR(NEXT_DAY(SYSDATE,'SUN'),'DD-MON-YY') FROM EMP;
17)select TO_CHAR(NEXT_DAY(SYSDATE,'FRI'),'DD-MON-YY') FROM EMP;
18)select To_CHAR(SYSDATE-5,'DD-MON-YY') FROM EMP;
19)ALTER SESSION SET NLS_DATE_FORMAT='yyyy-MM-DD';
20)ALTER SESSION SET NLS_DATE_FORMAT='yyyy-DAY';
21)CREATE TABLE STUFF (ID NUMBER,NAME VARCHAR2,DOB DATE,DEPARTMENT VARCHAR2,SALARY NUMBER );
22)INSERT INTO STUFF VALUES(1,'KANAT','TULBASSIYEV','05-10-90','LIBRARY','1500');

You might also like