Got stuck how to insert previous date and time [duplicate] - oracle

This question already has answers here:
How can i get the yesterday date in Oracle when the value of te date from specific column?
(2 answers)
Closed 11 months ago.
how to insert previous day date,and time. (i am using Date datatype)
Time is - 00:00:00

Subtract 1 from date value; doing so, you'd subtract 1 day.
Setting format (so that you'd know what is what):
SQL> alter session set nls_date_format = 'dd.mm.yyyy hh24:mi:ss';
Session altered.
SQL> select sysdate right_now,
2 sysdate - 1 yesterday,
3 trunc(sysdate - 1) yesterday_midnight
4 from dual;
RIGHT_NOW YESTERDAY YESTERDAY_MIDNIGHT
------------------- ------------------- -------------------
14.03.2022 11:16:14 13.03.2022 11:16:14 13.03.2022 00:00:00
SQL>

Related

Charts in Oracle Apex

Hi everyone I wanna ask u about how I can bring data last 24 hours into bar charts, is there any methods to make it please
I have this table without data
datetime
clientchannel
servicename
service_count
13_02_2022 9:35
*****
notification
2
It is a WHERE clause you need, I presume. Something like this:
select ...
from your_table
where datetime >= sysdate - 1;
Why? Because - when you subtract a number from DATE datatype value in Oracle - it subtracts that many days.
SQL> alter session set nls_date_format = 'dd.mm.yyyy hh24:mi:ss';
Session altered.
SQL> select sysdate right_now,
2 sysdate - 1 yesterday
3 from dual;
RIGHT_NOW YESTERDAY
------------------- -------------------
13.02.2022 11:01:34 12.02.2022 11:01:34
SQL>
If you store date values as strings (which means that DATETIME column is declared as e.g. VARCHAR2(20), and that's really bad idea), then you first have to convert it to a valid date datatype value - use TO_DATE function with appropriate format mask:
where to_date(datetime, 'dd_mm_yyyy hh24:mi') >= sysdate - 1
[EDIT] If you want to go 60 minutes back, then subtract that many minutes:
SQL> select sysdate right_now,
2 sysdate - interval '60' minute an_hour_ago
3 from dual;
RIGHT_NOW AN_HOUR_AGO
------------------- -------------------
14.02.2022 07:09:30 14.02.2022 06:09:30
SQL>

Oracle - Extract Year from date result in 0 [duplicate]

This question already has an answer here:
Trying to export a Oracle via PL/SQL gives a date of 0000-00-00
(1 answer)
Closed 1 year ago.
Duplicate of Trying to export a Oracle via PL/SQL gives a date of 0000-00-00 as mentioned by #AlexPoole
I have a table with different dates in it, however, when I try to extract year, a single row returns an incorrect result.
This incorrect result happens when I execute the following (note that TO_DATE and FROM_DATE are both of data_type DATE):
select
TO_DATE
,EXTRACT(YEAR FROM TO_DATE) as "TO_YEAR"
,EXTRACT(MONTH FROM TO_DATE) as "TO_MONTH"
,EXTRACT(DAY FROM TO_DATE) as "TO_DAY"
,FROM_DATE
,EXTRACT(YEAR FROM FROM_DATE) as "FROM_YEAR"
,EXTRACT(MONTH FROM FROM_DATE) as "FROM_MONTH"
,EXTRACT(DAY FROM FROM_DATE) as "FROM_DAY"
,DUMP(FROM_DATE, 1016) as FROM_DUMP
,to_char(FROM_DATE, 'SYYYY-MM-DD HH24:MI:SS') FROM_STRING
from SomeTable
The incorrect result is (date format is YY-MM-DD):
TO_DATE TO_YEAR TO_MONTH TO_DAY FROM_DAT FROM_YEAR FROM_MONTH FROM_DAY FROM_DUMP FROM_STRING
-------- ---------- ---------- ---------- -------- ---------- ---------- ---------- ----------------------------- --------------------
00-02-01 2000 2 1 01-02-01 0 2 1 Typ=12 Len=7: 64,64,2,1,1,1,1 00000-00-00 00:00:00
My question is why does FROM_YEAR return a zero and not 2001?
A DATE is stored in 7-bytes using:
century + 100
year-of-century + 100
month + 0
day + 0
hour + 1
minute + 1
second + 1
Looking at the output of DUMP, which is Typ=12 Len=7: 64,64,2,1,1,1,1 then you have:
Century = -36
Year-of-century = -36
Month = February
Day = 1
Hour = 0
Minute = 0
Year = 0
Which would make your date midnight of 1st February 3636 BC.
Unless you intended to use dates from ancient history then it would suggest that somewhere in your application some corrupted data has been stored.
However, something else appears to be going on as that is a valid date that can be stored and TO_CHAR should work.
CREATE TABLE table_name ( dt ) AS
SELECT DATE '-3636-02-01'FROM DUAL;
SELECT TO_CHAR( dt, 'SYYYY-MM-DD HH24:MI:SS' ) AS dt_string,
DUMP( dt )
FROM table_name;
Outputs:
DT_STRING
DUMP(DT)
-3636-02-01 00:00:00
Typ=12 Len=7: 64,64,2,1,1,1,1
db<>fiddle here
and the DUMP matches your data but the TO_CHAR output is valid whereas yours is zeros.

Calendar Last day of Month Oracle [duplicate]

This question already has answers here:
Oracle How to list last days of months between 2 dates
(5 answers)
Closed 1 year ago.
I need to create a calendar in Oracle with only last days of month between two dates.
I tried to do with this but it creates a calendar with all days between two dates and I only need the last dayS of the month.
begin
begin_date := TO_NUMBER(TO_CHAR(TO_DATE('2021-01-01', 'yyyy-MM-dd'), 'j'));
end_date := TO_NUMBER(TO_CHAR(ADD_MONTHS(LAST_DAY(TO_DATE(sysdate, 'yyyy-MM-dd')),-1), 'j'));
WITH calendar AS (
SELECT to_date(begin_date, 'mm/dd/yyyy') + ROWNUM - 1 c_date
FROM dual
CONNECT BY LEVEL <= to_date(end_date, 'mm/dd/yyyy')
- to_date(begin_date, 'mm/dd/yyyy') + 1
)
SELECT c_date "date", ID
FROM (SELECT c.c_date, EXPE.ID AS ID
FROM EXPEDIENTE EXPE, calendar c
WHERE EXPE.ID=1)
ORDER BY 1,2;
How can i do that?
No need for PL/SQL.
SQL> alter session set nls_date_format = 'dd.mm.yyyy';
Session altered.
SQL> with
2 period as
3 (select date '2020-11-07' start_date,
4 date '2021-04-15' end_date
5 from dual
6 )
7 select last_day(add_months(start_date, level - 1)) mon
8 from period
9 connect by level <= months_between(end_date, start_date) + 1
10 order by mon;
MON
----------
30.11.2020
31.12.2020
31.01.2021
28.02.2021
31.03.2021
30.04.2021
6 rows selected.
SQL>

First Monday of last month

I have to get the date of the first Monday of the previous month for an Oracle query.
The ms SQL is
select dateadd (day, (9 - datepart(dw, eomonth(getdate(), -2)))%7, eomonth(getdate(), -2))
but there is no dateadd function in Oracle.
Here you go:
SQL> alter session set nls_date_language = 'english';
Session altered.
SQL> alter session set nls_date_Format = 'dd.mm.yyyy day';
Session altered.
SQL>
SQL> select next_day(add_months(trunc(sysdate, 'mm'), -1), 'monday') first_monday
2 from dual;
FIRST_MONDAY
--------------------
02.03.2020 monday
SQL>
What does it do?
truncate today's date (SYSDATE) to 1st of month ('mm')
subtract 1 month (add_months)
use next_day function, along with the 'monday' parameter
You can use:
TRUNC(TRUNC(add_months(dt, -1), 'mm') + 6, 'iw')
This subtracts a month from the specified date, truncates it to the 1st of the month, then adds 6 days to it before finally truncating it to the start of the iso week (which is always a Monday).
You need to add 6 to the first of the month to allow the appropriate Monday to count as the first Monday of the month (otherwise you could end up picking the last Monday of the previous month.
You can see it working [here[(https://dbfiddle.uk/?rdbms=oracle_18&fiddle=c25bc32b3223b954e8fcb02b9b76ffd5)

Set day (1-31) portion only for date column in oracle

I need to set only the day portion of a date in oracle but retain month and year. Can you tell me what to do?
E.g. If date is 01-JAN-15 then i want to set day to 15 as 15-JAN-15.
1* select sysdate, trunc(sysdate, 'MONTH')+14 from dual
SQL> /
SYSDATE TRUNC(SYSDA
----------- -----------
25-sep-2015 15-sep-2015
SQL>

Resources