mona shiri
mona shiri

Reputation: 57

year value in table in oracle

I have this query in oracle:

 DELETE FROM my_table
 WHERE to_date(last_update, 'DD/MM/YYYY') < to_date('01/01/2000', 'DD/MM/YYYY');

when I run this, I get this error: ORA-01841: (full) year must be between -4713 and +9999 and must not be 0

there is not any 0 value in the table.

any one knows what is the problem?

Upvotes: 0

Views: 98

Answers (2)

Viktor T&#246;r&#246;k
Viktor T&#246;r&#246;k

Reputation: 1319

If the datatype of last_update is date, don't use the to_date function:

DELETE FROM my_table
 WHERE last_update < to_date('01/01/2000', 'DD/MM/YYYY');

Upvotes: 1

MT0
MT0

Reputation: 167814

I am assuming that you have stored your dates as a string with the DD/MM/YYYY format; it would be better if you stored them all as a DATE data type and then you would not have to do this conversion (and you would be using the most appropriate data type for the data).

From Oracle 12, you can use:

SELECT *
FROM   my_table
WHERE  TO_DATE( last_update, 'DD/MM/YYYY' DEFAULT NULL ON CONVERSION ERROR ) IS NULL;

To identify the rows that are raising that exception.


If you are already storing them as a DATE data type then don't use TO_DATE on a value that is already a DATE as TO_DATE expects a string so Oracle will implicitly cast your DATE to a string and then try to convert it back and your query is effectively:

DELETE FROM my_table
WHERE  TO_DATE(
         TO_CHAR(
           last_update,
           ( SELECT value FROM NLS_SESSION_SETTINGS WHERE PARAMETER = 'NLS_DATE_FORMAT' )
         ),
         'DD/MM/YYYY'
       ) < to_date('01/01/2000', 'DD/MM/YYYY');

And if the NLS_DATE_FORMAT and your format model do not match then you will get errors (or, worse, the query will succeed and your data will be inconsistent as it may have swapped days and months or months and years).

Instead, just use:

DELETE FROM my_table
WHERE last_update < DATE '2000-01-01';

Upvotes: 2

Related Questions