Oracle SYSDATE format Change - sql

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

Related

Oracle, finding data between two different dates

I have a table name as business_details and column name business_date whose data type is varchar2.
Now i have to find out the data between two different dates and date format like : 12-JUN-18 21:15:13
Means, 12 Jun, 2018.
Kindly help me to write a query which can fetch the data between these two dates :12-JUN-18 21:15:13 and 25-JUN-18 18:15:32
I assume that in table business_details you have an column date or something like that.
Than use something like this:
select business_date from business_details
where date between TO_DATE ('12-JUN-18 21:15:13','dd-MM-yy hh:mi:ss')
AND TO_DATE ('25-JUN-18 18:15:32','dd-MM-yy hh:mi:ss');
Assuming your business_date is actually a string in the format you've shown (and it isn't really a date your client is just showing in that format), you need to convert that to a date type, as well as converting the string literals.
select *
from business_details
where to_date(business_date, 'DD-MON-RR HH24:MI:SS')
between to_date('12-JUN-18 21:15:13', 'DD-MON-RR HH24:MI:SS')
and to_date('25-JUN-18 18:15:32', 'DD-MON-RR HH24:MI:SS');
The format model you tried to use in a comment did this:
to_date('12-JUN-18 21:15:13', 'DD-MM-YYYY HH24:MI:SS')
is using MM rather than MON, which works anyway by default - although using month numbers is safer anyway as they aren't dependent on your session language. But more importantly it uses YYYY. If you pass a 2-digit value like 18 and try to convert with YYYY you get the wrong year:
select to_date('12-JUN-18 21:15:13', 'DD-MON-YYYY HH24:MI:SS') form dual;
TO_DATE('12-JUN-182
-------------------
0018-06-12 21:15:13
In your version your business_date was being converted implicitly so would use NLS settings, which are presumably using RR already. But that means you were comparing a date in 2018 with a range in 0018, which is why nothing matched.
You could also use timestamp literals for the fixed values (unless those strings are actually being passed in from somewhere else):
select *
from business_details
where to_date(business_date, 'DD-MON-RR HH24:MI:SS')
between cast(timestamp '2018-06-12 21:15:13' as date)
and cast(timestamp '2018-06-25 18:15:32' as date);

SQL time and date formatting against dual table

I am trying to only display the date and time of a table in a certain format. This format is DD-MON-YYYY and the time HH24:MI:SS. I don't understand how to make both formats work together. I can get them to function separately.
select to_char(sysdate, 'DD-MON-YYYY', systimestamp,'HH24:MI:SS') from dual;
My error is 'too many arguments'. I want to understand why it isn't working.
From the documentation TO_CHAR takes three arguments when using dates
a date or date time
a format model
optional NLS parameter for the localization
You can concatenate the two results together with this.
select to_char(sysdate, 'DD-MON-YYYY')||' '|| TO_CHAR(systimestamp,'HH24:MI:SS') from dual;
But why would when you do it one call
SELECT TO_CHAR(systimestamp,'DD-MON-YYYY HH24:MI:SS') from dual;
NB SQL is not case sensitive in regards to keywords. Upper or lower case both work.
Try:
select to_char(sysdate, 'DD-MON-YYYY HH24:MI:SS') from dual;

ORA-01843: not a valid month with data type conversion

I have created a view where one of column command is:
TO_CHAR( TO_DATE(sysdate ||' '||TIMING.TIME,'dd-MON-RRRR HH:MIAM'),'dd-MON-RRRR HH:MIAM') as time
The value of TIMING.TIME is like this: 09:30AM as varchar2
When I run the query: select TO_DATE(time,'DD-MON-RRRR HH:MIAM')from view
I get the error
ORA-01843: not a valid month
NLS Language is American.
TO_DATE(sysdate
That is wrong.
Never apply TO_DATE on DATE data type. It forces Oracle to:
first convert it into a string
then convert it back to date
based on the locale-specific NLS settings. You need TO_DATE to convert a literal into date. For date-arithmetic, leave the date as it is.
If you are trying to configure the time portion in current date, then:
1. First convert the date into string
2. Then concatenate the time portion to the string
3. Finally apply TO_DATE
For example,
SQL> alter session set nls_date_format='DD-MM-YYYY HH:MI:SS AM';
Session altered.
SQL> SELECT to_date(TO_CHAR(sysdate, 'mm/dd/yyyy')
2 ||' '
3 ||'09:30AM', 'mm/dd/yyyy hh:miAM') TIME
4 FROM dual;
TIME
----------------------
14-10-2015 09:30:00 AM
Remember,
TO_DATE is used to convert a string into date.
TO_CHAR is used to display the date in desired string format.
Modified query for you:
to_date(TO_CHAR(sysdate, 'mm/dd/yyyy') ||' ' ||TIMING.TIME, 'mm/dd/yyyy hh:miAM')
AS "TIME"
sysdate stores time and it would be better to convert it to char before concatenation
TO_CHAR(sysdate,'dd-MON-RRRR')||' '||TIMING.TIME

Using toChar to output a date in W3C XML Schema xs:dateTime type format

I'm trying to convert sysdate using toChar to the following format:
2006-11-20T17:10:02+01:00
From this format:
16/08/2012 13:40:59
Is there a standard way of doing this?
I've tried using the toChar to specific the T part as a string but it doesn't appear to be working.
Thanks in advance
Jezzipin
EDIT:
I've tried Nicholas' solution however as I mention above, I need to use sysdate. I've used the following select query:
select to_char(to_timestamp_tz(sysdate-365, 'dd/mm/yyyy hh24:mi:ss'),'yyyy-mm-dd"T"hh24:mi:ss TZH:TZM') from dual;
However, this returns:
0012-08-16T00:00:00 +01:00
which is incorrect as it should be 2012-08-16T00:00:00 +01:00
Try:
select to_char(sysdate, 'yyyy-mm-dd') || 'T' || to_char(sysdate,'hh24:mi:ss') || sessiontimezone
from dual;
Returns:
2013-08-16T13:00:51+00:00
To display sysdate in the format that contains timezone information you need to do a series of conversions:
Convert sysdate to string literal using to_char() function.
Convert string literal to timestamp with tome zone using to_timestamp_tz() function.
And finally, convert the final result back to string literal using to_char().
as follows:
select to_char(
to_timestamp_tz(
to_char(sysdate - 365, 'dd/mm/yyyy hh24:mi:ss')
, 'dd/mm/yyyy hh24:mi:ss')
, 'yyyy-mm-dd"T"hh24:mi:ss TZH:TZM'
) as res
from dual
Result:
RES
--------------------------
2012-08-16T17:29:28 +04:00
You can include string literal in the format mask enclosing it with double quotes.
The value with 'T' is called ISO 8601, also known as 'XS:DateTime' or 'XSD:DateTime' or 'XML Schema DateTime'.
Note that Oracle's sessiontimezone command can return not only '-04:00' but also a value like 'America/Los_Angeles' (depending on the db settings), which is probably not something you want.
There is also a replacement required since TZ_OFFSET returns \0 - terminated string. So this should work:
create or replace function to_iso8601 (datetime_in in date) return varchar is
begin
return to_char(datetime_in, 'yyyy-mm-dd') || 'T' || to_char(datetime_in,'hh24:mi:ss') || replace(TZ_OFFSET(DBTIMEZONE),chr(0));
end;
/
select to_iso8601(sysdate) from dual;
result:
2014-11-03T16:53:45-04:00

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