how cast varchar to date in oracle - oracle

I have a column with NVACHAR2() format but it save date, like this(column name is ORGINALDATE):
1/9/2019 3:46:59 PM
I can not change format of column but I need to date of this. I used from
TO_DATE(ORGINALDATE,'MM/DD/YYYY HH:MI:SS') AS times
And after run show this error : --date format picture ends before converting entire input string

The error seems to be suggesting that the format you have given does not provide information for parsing the entire date with information being left over in the input string. This is then viewed as invalid. The reason this is happening is that the AM/PM of your original data is not captured in the format string. Looking https://www.techonthenet.com/oracle/functions/to_date.php, we see that AM/PM can be added to the format string. Therefore changing your format string to
MM/DD/YYYY HH:MI:SS PM
should fix it. It should be noted that any of A.M., AM, P.M., or PM appear to be valid and simply specify that time of day information is present.

Related

How to make a constraint on DATE FORMAT in ORACLE

say my usual Date format is '14-jan-2019' and i want my date to only be accepted as 'YYYY-MM-DD' how do i do that? and can i change jan to an actual number?
In my opinion, the right / correct way to do that is to declare your date column (or variable or whatever it is) as DATE, e.g.
create table test (date_column date);
or
declare
l_date_variable date;
begin
...
Doing so, you'd let the database take care about valid values.
You'd then be able to enter data any way you want, using any valid date format mask, e.g.
to_date('06.01.2020', 'dd.mm.yyyy')
date '2020-01-06'
to_date('2020-06-01', 'yyyy-dd-mm')
etc. - all those values would be valid.
A DATE data type has no format - it is stored internally as 7-bytes representing year (2 bytes) and month, day, hour, minute and second (1 byte each).
'14-JAN-2019' is not a date - it is a text literal.
If you want to store date values then use a DATE data type.
If you want to only accept strings of a specific format as input then in whatever user interface you use to talk to the database then accept only that format. If you are converting strings to DATEs and wanting an exact format then you can use:
TO_DATE( '2019-01-14', 'fxYYYY-MM-DD' )
Note: the fx format model will mean that the exact format is expected and the typical string-to-date conversion rules will not be applied.

timestamp conversion issue in oracle

I am trying to convert data from oracle date field which is in local eastern time to UTC format
and I'm using below function to achieve it
CAST("date field" AS TIMESTAMP) AT TIME ZONE 'UTC'
and my output looks like below
06-NOV-19 09.55.21.000000 AM
However i need to format the output to below format
11/6/2019 9:55:21.000000000 AM
Is there an oracle function which i directly use to do above format conversion?
Formatting and the actual value are separate things. The value, you say is correct, however you want it to look in a different style than the default.
Look into TO_CHAR if you want a specifically formatted string output. eg:
SELECT TO_char(cast(sysdate as timestamp) at time zone 'UTC','mm/dd/yyyy hh:mi:ssxFF am') from dual;
11/18/2019 07:39:42.000000 pm
I tried on my database and the same consult turn the expected result. Try to confer this web site that will show the config of date in oracle:
http://blog.marvinsiq.com/2018/08/23/formatar-data-e-hora-no-oracle-sql-developer/

How to Insert a Timestamp in Oracle in a Specific Format

I am at a loss as how to insert the current time in a different format than the default. Can somebody help explain?
Here is how my table was created:
CREATE TABLE ACTIVITY_LOG
(
TIME TIMESTAMP NOT NULL
, ACTIVITY VARCHAR2(200) NOT NULL
);
My insert command works:
insert into activity_log
values (localtimestamp,'blah');
But how do i insert the localtimestamp value into my table in a different format using the various MM DD YY HH MM SS tags? I've tried the following, but it gives me the ORA-1830: date format picture ends before converting entire input string error.
insert into activity_log
values (to_timestamp(localtimestamp,'YYYY/MM/DD'),'blah');
You don't insert a timestamp in a particular format. Timestamps (and dates) are stored in the database using an internal representation, which is betwen 7 and 11 bytes depending on the type and precision. There is more about that in this question, among others.
Your client or application decides how to display the value in a human-readable string form.
When you do:
to_timestamp(localtimestamp,'YYYY/MM/DD')
you are implicitly converting the localtimestamp to a string, using your session's NLS settings, and then converting it back to a timestamp. That may incidentally change the value - losing precision - but won't change how the value is stored internally. In your case the mismatch between the NLS setting and the format you are supplying is leading to an ORA-01830 error.
So your first insert is correct (assuming you really want the session time, not the server time). If you want to see the stored values in a particular format then either change your client session's NLS settings, or preferably format it explicitly when you query it, e.g.:
select to_char(time, 'YYYY-MM-DD HH24:MI:SS.FF3') from activity_log
You don't seem to provide any indication of what your 'localtimestamp' is - is that pseudocode? A variable name? A column you haven't shown the definition for?
What data type is 'localtimestamp'? What data does it contain? Pertinent questions as other answers point out, because if it truly is a time stamp then oracle will be converting it to a string for you, before passing that string to to_timestamp() in your final query. Your initial stab at it should just work if the variable is a timestamp, containing a timestamp
Ultimately "date format picture ends" means "you passed me a string looking like '2017-05-17 12:45:59', but claimed it was only 'yyyy-mm-dd'. What was I expected to do with the rest of it?"
Your current final comment on your question "I was hoping to look in the table and see a useful looking time" - that's your query tool's problem. Have a look in the setting of your query tool and change the date format it displays. As has been noted, dates in oracle are stored as a decimal number days since a certain moment in time. If 0 represents 01 Jan 1970, then 1.75 represents 6pm on the 2 Jan 1970. It is up to the end program the user is using, to format the date into something you like.. you cannot "insert a timestamp with a different format" because time stamps don't have a format any more than a number like 1.75 has a format. It is what your query does with it when it gets it out, that gives it the format:
To_char(timestampcol, 'yyyy mm did')
To-char(tomestampcol, 'mon dd yyyy')
These use oracles built in date formatter, that turns that decimal number of the date into a string in the given format; you will see a string.. or you can just write "select * from table" and run it in TOAD and toad will show you the dates according to the format in settings, or you can write a c# program and get a load of date objects out and call my date.ToString("yyyy-MM-dd") on them to format them. The idea I'm trying to get across is that you don't pick the date format on the way in, you pick it on the way out, if you don't like what you're looking at, you have to change it on the way out, not the way in

date format with inconsistant data Oracle SQL

I am have a freetext column which a date is input to.
is there a way i can force the output to display the same?
for example some people are entering '2/12/15' others are entering '02/12/2015'
how i can i get the output to pick up the dates and change them to a consistant format?
no idea where to start. I have tried "To_char" but it says 'invalid number'
Actually I believe you want to_date( ):
select to_date('2/12/15', 'mm/dd/rrrr')
from dual;
The 'rrrr' for year will format the year correctly. See date formats here: https://docs.oracle.com/cd/B28359_01/server.111/b28286/sql_elements004.htm
Your best approach here may be to use a PL/SQL function that accepts the string and then attempts a series of date conversions on it with different date format pictures ('DD/MM/YY', 'DD/MM/YYYY' etc) until it finds one that does not raise an exception.
This won't work if some people enter DD/MM/YYYY and others enter MM/DD/YYYY, but will appear to in some cases.

Converting XML date (ISO-8601) into timestamp in Oracle

Could you please help me in converting date time of format from "2015-02-23T16:26:41.485+05:30" to "23-FEB-15 16.26.41.000000000 AM" in Oracle.
I have an ISO-8601 date string in variable:
START_TIME='2015-02-23T16:26:41.485+05:30'
When I use
to_timestamp(START_TIME,'yyyy-mm-dd"T"hh24:mi:ss.ff3')
I get:
Error report:
ORA-01830: date format picture ends before converting entire input string
ORA-06512: at line 55
01830. 00000 - "date format picture ends before converting entire input string"
*Cause:
*Action:
To convert your string to a timestamp with time zone value, you need the to_timestamp_tz() function:
select to_timestamp_tz('2015-02-23T16:26:41.485+05:30',
'yyyy-mm-dd"T"hh24:mi:ss.ff3tzh:tzm') as result
from dual;
RESULT
-----------------------------------
2015-02-23 16:26:41.485000 +05:30
This includes the TZH and TZM datetime format model elements to handle the time zone offset; those can't be used in to_timestamp() or to_date() as those data types don't understand time zones.
You seem to want to lose the fractional seconds part, and the time zone information; you can achieve both at once by casting to a timestamp (without timezone) with the fractional seconds precision set to zero:
select cast(to_timestamp_tz('2015-02-23T16:26:41.485+05:30',
'yyyy-mm-dd"T"hh24:mi:ss.ff3tzh:tzm') as timestamp(0)) as result
from dual;
RESULT
-----------------------------------
2015-02-23 16:26:41.000000
But losing the time zone seems dangerous, unless you are sure that the data you receive is always going to be in the same time zone as your database. If you might have different time zones in the data but for some reason don't want to retain that information, you can also convert to a specific time zone for storage, but it isn't clear whether you need or want that here. If you aren't keeping the time zone or the fractional seconds, you may be better off with a date anyway.
Dates and timestamps do not have any inherent format within the database. If you then want to see that converted back into a string in the format you specified, pass it back into a to_char() call with the formatting you want; but as your example has both a 24-hour-clock hour value and an (incorrect) AM/PM indicator that isn't clear either. Maybe you want:
select to_char(cast(to_timestamp_tz('2015-02-23T16:26:41.485+05:30',
'yyyy-mm-dd"T"hh24:mi:ss.ff3tzh:tzm') as timestamp(0)),
'dd-MON-rr hh:mi:ss.ff9 am') as result
from dual;
RESULT
-----------------------------------
23-FEB-15 04:26:41.000000000 PM
To store the value from your START_TIME variable in a timestamp column the approach is exactly the same, just use that instead of the fixed value I've used above to demonstrate the conversion:
cast(to_timestamp_tz(START_TIME, 'yyyy-mm-dd"T"hh24:mi:ss.ff3tzh:tzm')
as timestamp(0))

Resources