Current date and time in Oracle SQL - sql

I want a SQL query to show the current date and time.
I have tried
SELECT CURRENT_TIMESTAMP; --"FROM keyword not found where expected"
SELECT GETDATE(); --"FROM keyword not found where expected"
SELECT GETUTCDATE(); --"FROM keyword not found where expected"
NOW(); -- Error report - Unknown Command
But none of them worked.
Requesting your help.
Thanks!

Oracle supports ANSI standard variables CURRENT_TIMESTAMP and CURRENT_DATE with mandatory FROM clause -
SELECT CURRENT_TIMESTAMP FROM DUAL;
SELECT CURRENT_DATE FROM DUAL;
Alternatively, You can use Oracle specific date variable SYSDATE also -
SELECT SYSDATE FROM DUAL;
Demo.

You probably want to handle the format of date/time fetched. For that you can use To_Char() function. Some of the options are:
Select
SYSDATE "DB_FORMAT_DATE",
To_Char(SYSDATE, 'dd-Month yyyy') "DATE_FORMAT_1",
To_Char(SYSDATE, 'dd.mm.yyyy') "DATE_FORMAT_1",
To_Char(SYSDATE, 'hh:mi:ss am') "TIME_FORMAT_1",
To_Char(SYSDATE, 'hh24:mi:ss') "TIME_FORMAT_2",
To_Char(SYSDATE, 'dd-Mon-yyyy hh24:mi:ss') "DATETIME_FORMAT_ANY"
From Dual
DB_FORMAT_DATE DATE_FORMAT_1 DATE_FORMAT_1 TIME_FORMAT_1 TIME_FORMAT_2 DATETIME_FORMAT_ANY
-------------- ----------------- ------------- ------------- ------------- --------------------
02-FEB-23 02-February 2023 02.02.2023 04:29:30 PM 16:29:30 02-Feb-2023 16:29:30
More about it here.

Related

Can the TO_CHAR in ORACLE HAVE (TO_CHAR(04-28-2017, 'yyyy')) INSTEAD OF Passing a Column name as TO_CHAR(sysdate, 'yyyy/mm/dd')

In general, we pass a column name to the TO_CHAR CLause as TO_CHAR(sysdate, 'yyyy/mm/dd').
I want to know whether can we pass a date in the place of column name as (TO_CHAR(04-28-2017, 'yyyy'))
No, you can't because TO_CHAR function expects either number or date/time value as it's parameter. This can be tested easily.
SQL> select to_char('12-04-2017','DD-MM-YYYY') from dual;
select to_char('12-04-2017','DD-MM-YYYY') from dual
*
ERROR at line 1:
ORA-01722: invalid number
You need to convert the string to date.
SQL> select to_char(to_date('12-04-2017','DD-MM-YYYY'),'YYYY') from dual;
TO_C
----
2017
OR
SQL> select to_char(date '2017-04-12','YYYY') from dual;
TO_C
----
2017

Oracle SYSDATE format Change

I am trying to change a format of Oracle SYSDATE so that it uses a specific format when running a PL/SQL procedure. This format is really unnecessary but I am update an old table and need to maintain this format due to some integrations. My problem is I am not able to replicate the format.
The format needed is: 15/MAR/17 09:31:08.000000000
Currently the below is the closest I can get, I am not sure how to change MM to display MAR instead of 03.
SELECT TO_CHAR
(SYSDATE, 'DD/MM/YY HH24:MI:SS.SSSSSSSSS')
FROM DUAL;
Thanks a mill in advance
MON will display Month instead of numeric.
SELECT TO_CHAR
(SYSDATE, 'DD/MON/YY HH24:MI:SS."000000000"')
FROM DUAL;
SYSDATE is of DATE type, which does not support fractional seconds, so you either need to concatenate .000000000 with the formatted date:
SELECT TO_CHAR(
SYSDATE,
'DD/MM/YY HH24:MI:SS'
) || '.000000000'
FROM DUAL;
Or you need to CAST the DATE to a TIMESTAMP:
SELECT TO_CHAR(
CAST( SYSDATE AS TIMESTAMP ),
'DD/MM/YY HH24:MI:SS.FF9'
)
FROM DUAL;
To convert to text in the format you want (not that you should need to unless the DB design is awful).
substr(to_char(systimestamp,'DD/MON/YY HH24:MI:SS.FF') || '000000000', 1, 28)
or
to_char(sysdate,'DD/MON/YY HH24:MI:SS') || '.000000000'
Details on the format mask can be found here.
Note: sysdate does not return the fraction of a second, so if this is required, use systimestamp

Converting String Date to Date Time in Oracle

I have a situation where I need to convert the datetime value stored as string to Timestamp:
I am using oracle database
This actually works for me select TO_DATE('11-27-2013 21:28:41', 'MM-DD-YYYY HH24:MI:SS') from dual;
But my date value now is diffent from the above:
select TO_DATE('Sunday 6/1/2014 8:00AM', 'MM-DD-YYYY HH24:MI:SS') from dual; - failed. I have 'Sunday' inside my date.
You have to specify a correct format mask to the TO_DATE function. See a full list of format masks along with documentation for the function here: http://www.techonthenet.com/oracle/functions/to_date.php
You can correct your problem by:
SELECT TO_DATE('Sunday 6/1/2014 8:00AM', 'DAY M/D/YYYY HH:MIAM') FROM DUAL;
Try using the correct format. I think this will work:
select TO_DATE('Sunday 6/1/2014 8:00AM', 'DAY MM/DD/YYYY HH:MI AM')
Here is a SQL Fiddle.
The following seems to work fine:
SELECT TO_DATE('Sunday 6/1/2014 8:00AM', 'DAY MM/DD/YYYY HH:MIAM') FROM DUAL
Share and enjoy.

Invalid month-SQL

for rate in ( select tgt.carrier_code, tgt.tc_code, tgt.exp_date, (TO_date(src.eff_date,'DD/MM/RRRR HH24:MI:SS') - 1/(24*60*60)) eff_date from mira_rate
tgt, mira_rate_dummy src
where src.carrier_code=tgt.carrier_code and src.tc_code=tgt.tc_code)
loop
update mira_rate
set exp_date=to_date(rate.eff_date,'DD/MM/RRRR HH24:MI:SS')
end loop;
When i run this query I am getting Format error.
How to correct this? I treid giving diff to_date options it says some .
Pls suggest
Assuming the question title means you got ORA-01843: not a valid month, this is probably down to your unnecessary to_date() calls as a_horse_with_no_name suggested, but it depends on your NLS_DATE_FORMAT setting. It's easy enough to reproduce, but only by making an assumption about your environment:
alter session set nls_date_format = 'MM/DD/RRRR';
select to_date(eff_date, 'DD/MM/RRRR HH24:MI:SS') from (
select (to_date(sysdate, 'DD/MM/RRRR HH24:MI:SS') - 1/(24*60*60)) eff_date
from dual
);
which gives:
select (to_date(sysdate, 'DD/MM/RRRR HH24:MI:SS') - 1/(24*60*60)) eff_date
*
ERROR at line 2:
ORA-01843: not a valid month
or since the error's pointing to the inner select, just:
SQL> select to_date(sysdate, 'DD/MM/RRRR HH24:MI:SS') from dual;
select to_date(sysdate, 'DD/MM/RRRR HH24:MI:SS') from dual
*
ERROR at line 1:
ORA-01843: not a valid month
The issue is that you're doing an implicit conversion of your date; effectively:
select to_date(to_char(sysdate, 'MM/DD/RRRR'), 'DD/MM/RRRR HH24:MI:SS')
The implicit conversion renders that as 01/28/2013 (or with the time as well, if that's in your NLS date mask), and when you then try to convert that back to a date with mask DD/MM/RRRR ... it's trying to use '28' as the month, which is clearly invalid.
If your fields are already dates then your to_date() calls are pointless, confusing and in this case causing an error. You should be able to do:
for rate in (select tgt.carrier_code, tgt.tc_code, tgt.exp_date,
src.eff_date - interval '1' second as eff_date
from mira_rate tgt, mira_rate_dummy src
where src.carrier_code=tgt.carrier_code and src.tc_code=tgt.tc_code)
loop
update mira_rate
set exp_date = rate.eff_date;
end loop;
I changed your - 1/(24*60*60) to - interval '1' second because I find that clearer, but it has the same effect.
Your update doesn't have a where clause though, but since it was missing a ; that might have been lost in transcription.

How to change the date format from MM/DD/YYYY to YYYY-MM-DD in PL/SQL?

I have a date column in a table stored as MM/DD/YYYY format. I have to select and store the same date in another table in YYYY-MM-DD format i.e. XSD Date Format. But I am not able to do it. I am using this query:
select to_date(date_column,'YYYY-MM-DD') from table;
But still I am not able to do it. Giving me error
ORA-01843 : not a valid month
use
select to_char(date_column,'YYYY-MM-DD') from table;
It sounds like you've got it the wrong way round. If your existing data is in MM/DD/YYYY format, then you want:
select to_date(date_column,'MM/DD/YYYY') from table;
to convert the existing data to DATE values. (I do wonder why they're not stored as dates, to be honest...)
If you want to perform the conversion in one step, you might want:
select to_char(to_date(date_column,'MM/DD/YYYY'), 'YYYY-MM-DD') from table;
In other words, for each row, parse it in MM/DD/YYYY format, then reformat it to YYYY-MM-DD format.
(I'd still suggest trying to keep data in its "natural" type though, rather than storing it as text in the first place.)
I assume that you can use the Oracle SQL Developer, which you can download from here.
You can define the date format which you want to work with:
ALTER SESSION SET nls_date_format='yyyy-mm-dd';
With this, now you can perform a query like this:
SELECT * FROM emp_company WHERE JDate = '2014-02-25'
If you want to be more specific you can define the date format like this:
ALTER SESSION SET nls_date_format='yyyy-mm-dd hh24:mi:ss';
To convert a DATE column to another format, just use TO_CHAR() with the desired format, then convert it back to a DATE type:
SELECT TO_DATE(TO_CHAR(date_column, 'DD-MM-YYYY'), 'DD-MM-YYYY') from my_table
select to_date(to_char(ORDER_DATE,'YYYY/MM/DD'))
from ORDERS;
This might help but, at the end you will get a string not the date. Apparently,
your format problem will get solved for sure .
For military time formatting,
select TO_CHAR(SYSDATE, 'yyyy-mm-dd hh24:mm:ss') from DUAL
--2018-07-10 15:07:15
If you want your date to round DOWN to Month, Day, Hour, Minute, you can try
SELECT TO_CHAR( SYSDATE, 'yyyy-mm-dd hh24:mi:ss') "full-date" --2018-07-11 10:40:26
, TO_CHAR( TRUNC(SYSDATE, 'year'), 'yyyy-mm-dd hh24:mi:ss') "trunc-to-year"-- 2018-01-01 00:00:00
, TO_CHAR( TRUNC(SYSDATE, 'month'), 'yyyy-mm-dd hh24:mi:ss') "trunc-to-month" -- 2018-07-01 00:00:00
, TO_CHAR( TRUNC(SYSDATE, 'day'), 'yyyy-mm-dd hh24:mi:ss') "trunc-to-Sunday" -- 2018-07-08 00:00:00
, TO_CHAR( TRUNC(SYSDATE, 'dd'), 'yyyy-mm-dd hh24:mi:ss') "trunc-to-day" -- 2018-07-11 00:00:00
, TO_CHAR( TRUNC(SYSDATE, 'hh'), 'yyyy-mm-dd hh24:mi:ss') "trunc-to-hour" -- 2018-07-11 10:00:00
, TO_CHAR( TRUNC(SYSDATE, 'mi'), 'yyyy-mm-dd hh24:mi:ss') "trunc-to-minute" -- 2018-07-11 10:40:00
from DUAL
For formats literals, you can find help in
https://docs.oracle.com/cd/B28359_01/server.111/b28286/functions242.htm#SQLRF52037
You can do this simply by :
select to_char(to_date(date_column, 'MM/DD/YYYY'), 'YYYY-MM-DD') from table
According to the comments, the data-type in the datatable is DATE.
So you should simply use:
"select date_column from table;"
Now if you execute the select you will get back a date data-type, which should be what you need for the .xsd.
Culture-dependent formating of the date should be done in the GUI (most languages have convenient ways to do so), not in the select-statement.
Basically , Data in a Date column in Oracle can be stored in any user defined format or kept as default.
It all depends on NLS parameter.
Current format can be seen by : SELECT SYSDATE FROM DUAL;
If you try to insert a record and insert statement is NOT in THIS format then it will give :
ORA-01843 : not a valid month error.
So first change the database date format before insert statements ( I am assuming you have bulk load of insert statements) and then execute insert script.
Format can be changed by :
ALTER SESSION SET nls_date_format = 'mm/dd/yyyy hh24:mi:ss';
Also You can Change NLS settings from SQL Developer GUI , (Tools > preference> database > NLS)
Ref: http://oracle.ittoolbox.com/groups/technical-functional/oracle-sql-l/how-to-view-current-date-format-1992815
This worked for me! You can convert to datatype you want be it a date or string
to_char(TO_DATE(TO_CHAR(end_date),'MM-DD-YYYY'),'YYYY-MM-DD') AS end_date
Late reply but for.databse-date-type the following line works.
SELECT to_date(t.given_date,'DD/MM/RRRR') response_date FROM Table T
given_date's column type is Date
Just to piggy back off of Yahia, if you have a timestamp you can use this function to cast exclusively as date, removing the timestamps.
TO_CHAR(CAST(DateTimeField AS DATE), 'YYYY-MM-DD') AS TrackerKey__C
Or in my case I need the below format
TO_CHAR(CAST(DateTimeField AS DATE), 'YYYYMMDD') AS TrackerKey__C
SELECT TO_DATE(TO_CHAR(date_column,'MM/DD/YYYY'), 'YYYY-MM-DD')
FROM table;
if you need to change your column output date format just use to_char this well get you a string, not a date.
use
SELECT STR_TO_DATE(date_column,'%Y-%m-%d') from table;
also gothrough
http://dev.mysql.com/doc/refman/5.0/en/date-and-time-functions.html