Populate future dates in oracle table
I have a script to populate previous(2016), current(2017) and complete next year(2018). The script is intended to be run initially to populate table. It can be run only once since it populates prior dates. How do I populate future dates (2019)?
insert into my_date
SELECT TO_NUMBER (TO_CHAR (mydate, 'yyyymmdd')) AS my_date_id,
mydate AS datetime_start,
mydate + 1 - 1/86400 AS datetime_end,
TO_CHAR (mydate, 'dd-MON-yyyy') AS date_value,
TO_NUMBER (TO_CHAR (mydate, 'D')) AS day_of_week,
TO_CHAR (mydate, 'Day') AS day_of_week_name,
TO_CHAR (mydate, 'DY') AS day_of_week_name_short,
TO_NUMBER (TO_CHAR (mydate, 'DD')) AS day_of_month,
TRUNC (mydate) - TRUNC (mydate, 'Q') + 1 AS day_of_quarter,
TO_NUMBER (TO_CHAR (mydate, 'DDD')) AS day_of_year,
CASE WHEN TO_NUMBER (TO_CHAR (mydate, 'D')) IN (1, 7) THEN 1
ELSE 0
END AS weekend_flag,
TO_NUMBER (TO_CHAR (mydate, 'W')) AS week_in_month,
TO_NUMBER (TO_CHAR (mydate, 'WW')) AS week_in_year,
TRUNC(mydate, 'w') AS week_start_date,
TRUNC(mydate, 'w') + 7 - 1/86400 AS week_end_date,
TO_CHAR (mydate, 'MM') AS month_value,
TO_CHAR (mydate, 'Month') AS month_name,
TO_CHAR (mydate, 'MON') AS month_name_short,
TRUNC (mydate, 'mm') AS month_start_date,
LAST_DAY (TRUNC (mydate, 'mm')) + 1 - 1/86400 AS month_end_date,
TO_NUMBER ( TO_CHAR( LAST_DAY (TRUNC (mydate, 'mm')), 'DD')) AS days_in_month,
CASE WHEN mydate = LAST_DAY (TRUNC (mydate, 'mm')) THEN 1
ELSE 0
END AS last_day_of_month_flag,
TO_CHAR (mydate, 'yyyy') AS year_value,
'YR' || TO_CHAR (mydate, 'yyyy') AS year_name,
'YR' || TO_CHAR (mydate, 'yy') AS year_name_short,
TRUNC (mydate, 'Y') AS year_start_date,
ADD_MONTHS (TRUNC (mydate, 'Y'), 12) - 1/86400 AS year_end_date,
ADD_MONTHS (TRUNC (mydate, 'Y'), 12) - TRUNC (mydate, 'Y') AS days_in_year
FROM ( SELECT TRUNC (ADD_MONTHS (SYSDATE, -12), 'yy') - 1 + LEVEL AS mydate
FROM dual
CONNECT BY LEVEL <= (SELECT TRUNC (ADD_MONTHS (SYSDATE, 24), 'yy')
- TRUNC (ADD_MONTHS (SYSDATE, -12), 'yy')
FROM DUAL
)
);
A change will be required within FROM clause to avoid existing records. How do I achieve that?
sql oracle
add a comment |
I have a script to populate previous(2016), current(2017) and complete next year(2018). The script is intended to be run initially to populate table. It can be run only once since it populates prior dates. How do I populate future dates (2019)?
insert into my_date
SELECT TO_NUMBER (TO_CHAR (mydate, 'yyyymmdd')) AS my_date_id,
mydate AS datetime_start,
mydate + 1 - 1/86400 AS datetime_end,
TO_CHAR (mydate, 'dd-MON-yyyy') AS date_value,
TO_NUMBER (TO_CHAR (mydate, 'D')) AS day_of_week,
TO_CHAR (mydate, 'Day') AS day_of_week_name,
TO_CHAR (mydate, 'DY') AS day_of_week_name_short,
TO_NUMBER (TO_CHAR (mydate, 'DD')) AS day_of_month,
TRUNC (mydate) - TRUNC (mydate, 'Q') + 1 AS day_of_quarter,
TO_NUMBER (TO_CHAR (mydate, 'DDD')) AS day_of_year,
CASE WHEN TO_NUMBER (TO_CHAR (mydate, 'D')) IN (1, 7) THEN 1
ELSE 0
END AS weekend_flag,
TO_NUMBER (TO_CHAR (mydate, 'W')) AS week_in_month,
TO_NUMBER (TO_CHAR (mydate, 'WW')) AS week_in_year,
TRUNC(mydate, 'w') AS week_start_date,
TRUNC(mydate, 'w') + 7 - 1/86400 AS week_end_date,
TO_CHAR (mydate, 'MM') AS month_value,
TO_CHAR (mydate, 'Month') AS month_name,
TO_CHAR (mydate, 'MON') AS month_name_short,
TRUNC (mydate, 'mm') AS month_start_date,
LAST_DAY (TRUNC (mydate, 'mm')) + 1 - 1/86400 AS month_end_date,
TO_NUMBER ( TO_CHAR( LAST_DAY (TRUNC (mydate, 'mm')), 'DD')) AS days_in_month,
CASE WHEN mydate = LAST_DAY (TRUNC (mydate, 'mm')) THEN 1
ELSE 0
END AS last_day_of_month_flag,
TO_CHAR (mydate, 'yyyy') AS year_value,
'YR' || TO_CHAR (mydate, 'yyyy') AS year_name,
'YR' || TO_CHAR (mydate, 'yy') AS year_name_short,
TRUNC (mydate, 'Y') AS year_start_date,
ADD_MONTHS (TRUNC (mydate, 'Y'), 12) - 1/86400 AS year_end_date,
ADD_MONTHS (TRUNC (mydate, 'Y'), 12) - TRUNC (mydate, 'Y') AS days_in_year
FROM ( SELECT TRUNC (ADD_MONTHS (SYSDATE, -12), 'yy') - 1 + LEVEL AS mydate
FROM dual
CONNECT BY LEVEL <= (SELECT TRUNC (ADD_MONTHS (SYSDATE, 24), 'yy')
- TRUNC (ADD_MONTHS (SYSDATE, -12), 'yy')
FROM DUAL
)
);
A change will be required within FROM clause to avoid existing records. How do I achieve that?
sql oracle
How about adding a where clause -WHERE TO_NUMBER (TO_CHAR (mydate, 'yyyymmdd')) NOT IN (SELECT my_Date_id from my_Date);
– rs.
Nov 13 '18 at 20:36
Add some sample table data and the expected result - all as formatted text, not images. (Take a look at stackoverflow.com/help/mcve before you spend too much time.)
– jarlh
Nov 13 '18 at 21:00
add a comment |
I have a script to populate previous(2016), current(2017) and complete next year(2018). The script is intended to be run initially to populate table. It can be run only once since it populates prior dates. How do I populate future dates (2019)?
insert into my_date
SELECT TO_NUMBER (TO_CHAR (mydate, 'yyyymmdd')) AS my_date_id,
mydate AS datetime_start,
mydate + 1 - 1/86400 AS datetime_end,
TO_CHAR (mydate, 'dd-MON-yyyy') AS date_value,
TO_NUMBER (TO_CHAR (mydate, 'D')) AS day_of_week,
TO_CHAR (mydate, 'Day') AS day_of_week_name,
TO_CHAR (mydate, 'DY') AS day_of_week_name_short,
TO_NUMBER (TO_CHAR (mydate, 'DD')) AS day_of_month,
TRUNC (mydate) - TRUNC (mydate, 'Q') + 1 AS day_of_quarter,
TO_NUMBER (TO_CHAR (mydate, 'DDD')) AS day_of_year,
CASE WHEN TO_NUMBER (TO_CHAR (mydate, 'D')) IN (1, 7) THEN 1
ELSE 0
END AS weekend_flag,
TO_NUMBER (TO_CHAR (mydate, 'W')) AS week_in_month,
TO_NUMBER (TO_CHAR (mydate, 'WW')) AS week_in_year,
TRUNC(mydate, 'w') AS week_start_date,
TRUNC(mydate, 'w') + 7 - 1/86400 AS week_end_date,
TO_CHAR (mydate, 'MM') AS month_value,
TO_CHAR (mydate, 'Month') AS month_name,
TO_CHAR (mydate, 'MON') AS month_name_short,
TRUNC (mydate, 'mm') AS month_start_date,
LAST_DAY (TRUNC (mydate, 'mm')) + 1 - 1/86400 AS month_end_date,
TO_NUMBER ( TO_CHAR( LAST_DAY (TRUNC (mydate, 'mm')), 'DD')) AS days_in_month,
CASE WHEN mydate = LAST_DAY (TRUNC (mydate, 'mm')) THEN 1
ELSE 0
END AS last_day_of_month_flag,
TO_CHAR (mydate, 'yyyy') AS year_value,
'YR' || TO_CHAR (mydate, 'yyyy') AS year_name,
'YR' || TO_CHAR (mydate, 'yy') AS year_name_short,
TRUNC (mydate, 'Y') AS year_start_date,
ADD_MONTHS (TRUNC (mydate, 'Y'), 12) - 1/86400 AS year_end_date,
ADD_MONTHS (TRUNC (mydate, 'Y'), 12) - TRUNC (mydate, 'Y') AS days_in_year
FROM ( SELECT TRUNC (ADD_MONTHS (SYSDATE, -12), 'yy') - 1 + LEVEL AS mydate
FROM dual
CONNECT BY LEVEL <= (SELECT TRUNC (ADD_MONTHS (SYSDATE, 24), 'yy')
- TRUNC (ADD_MONTHS (SYSDATE, -12), 'yy')
FROM DUAL
)
);
A change will be required within FROM clause to avoid existing records. How do I achieve that?
sql oracle
I have a script to populate previous(2016), current(2017) and complete next year(2018). The script is intended to be run initially to populate table. It can be run only once since it populates prior dates. How do I populate future dates (2019)?
insert into my_date
SELECT TO_NUMBER (TO_CHAR (mydate, 'yyyymmdd')) AS my_date_id,
mydate AS datetime_start,
mydate + 1 - 1/86400 AS datetime_end,
TO_CHAR (mydate, 'dd-MON-yyyy') AS date_value,
TO_NUMBER (TO_CHAR (mydate, 'D')) AS day_of_week,
TO_CHAR (mydate, 'Day') AS day_of_week_name,
TO_CHAR (mydate, 'DY') AS day_of_week_name_short,
TO_NUMBER (TO_CHAR (mydate, 'DD')) AS day_of_month,
TRUNC (mydate) - TRUNC (mydate, 'Q') + 1 AS day_of_quarter,
TO_NUMBER (TO_CHAR (mydate, 'DDD')) AS day_of_year,
CASE WHEN TO_NUMBER (TO_CHAR (mydate, 'D')) IN (1, 7) THEN 1
ELSE 0
END AS weekend_flag,
TO_NUMBER (TO_CHAR (mydate, 'W')) AS week_in_month,
TO_NUMBER (TO_CHAR (mydate, 'WW')) AS week_in_year,
TRUNC(mydate, 'w') AS week_start_date,
TRUNC(mydate, 'w') + 7 - 1/86400 AS week_end_date,
TO_CHAR (mydate, 'MM') AS month_value,
TO_CHAR (mydate, 'Month') AS month_name,
TO_CHAR (mydate, 'MON') AS month_name_short,
TRUNC (mydate, 'mm') AS month_start_date,
LAST_DAY (TRUNC (mydate, 'mm')) + 1 - 1/86400 AS month_end_date,
TO_NUMBER ( TO_CHAR( LAST_DAY (TRUNC (mydate, 'mm')), 'DD')) AS days_in_month,
CASE WHEN mydate = LAST_DAY (TRUNC (mydate, 'mm')) THEN 1
ELSE 0
END AS last_day_of_month_flag,
TO_CHAR (mydate, 'yyyy') AS year_value,
'YR' || TO_CHAR (mydate, 'yyyy') AS year_name,
'YR' || TO_CHAR (mydate, 'yy') AS year_name_short,
TRUNC (mydate, 'Y') AS year_start_date,
ADD_MONTHS (TRUNC (mydate, 'Y'), 12) - 1/86400 AS year_end_date,
ADD_MONTHS (TRUNC (mydate, 'Y'), 12) - TRUNC (mydate, 'Y') AS days_in_year
FROM ( SELECT TRUNC (ADD_MONTHS (SYSDATE, -12), 'yy') - 1 + LEVEL AS mydate
FROM dual
CONNECT BY LEVEL <= (SELECT TRUNC (ADD_MONTHS (SYSDATE, 24), 'yy')
- TRUNC (ADD_MONTHS (SYSDATE, -12), 'yy')
FROM DUAL
)
);
A change will be required within FROM clause to avoid existing records. How do I achieve that?
sql oracle
sql oracle
asked Nov 13 '18 at 20:33
dpsdps
306
306
How about adding a where clause -WHERE TO_NUMBER (TO_CHAR (mydate, 'yyyymmdd')) NOT IN (SELECT my_Date_id from my_Date);
– rs.
Nov 13 '18 at 20:36
Add some sample table data and the expected result - all as formatted text, not images. (Take a look at stackoverflow.com/help/mcve before you spend too much time.)
– jarlh
Nov 13 '18 at 21:00
add a comment |
How about adding a where clause -WHERE TO_NUMBER (TO_CHAR (mydate, 'yyyymmdd')) NOT IN (SELECT my_Date_id from my_Date);
– rs.
Nov 13 '18 at 20:36
Add some sample table data and the expected result - all as formatted text, not images. (Take a look at stackoverflow.com/help/mcve before you spend too much time.)
– jarlh
Nov 13 '18 at 21:00
How about adding a where clause -
WHERE TO_NUMBER (TO_CHAR (mydate, 'yyyymmdd')) NOT IN (SELECT my_Date_id from my_Date);
– rs.
Nov 13 '18 at 20:36
How about adding a where clause -
WHERE TO_NUMBER (TO_CHAR (mydate, 'yyyymmdd')) NOT IN (SELECT my_Date_id from my_Date);
– rs.
Nov 13 '18 at 20:36
Add some sample table data and the expected result - all as formatted text, not images. (Take a look at stackoverflow.com/help/mcve before you spend too much time.)
– jarlh
Nov 13 '18 at 21:00
Add some sample table data and the expected result - all as formatted text, not images. (Take a look at stackoverflow.com/help/mcve before you spend too much time.)
– jarlh
Nov 13 '18 at 21:00
add a comment |
1 Answer
1
active
oldest
votes
A pipelined function might help you here.
- Create a table type that will match the results your function will return.
- Create a function which returns exactly the dates you want. It can run queries to make sure the date isn't already in your table, is within your desired date range, etc.
- Return the values one by one stopping once you hit your criteria.
- Select from the function using the TABLE() function to turn the results into a table you can query. Use the OBJECT_VALUE to access the actual value being returned (since it doesn't really have a column name).
create or replace type date_tbl_t as table of date;
/
create or replace function all_dates ( max_year_in in integer )
return date_tbl_t
pipelined
as
date_l date;
offset_l pls_integer := 0;
year_l integer;
begin
if date_l is null
then
date_l := sysdate;
end if;
year_l := extract ( year from date_l );
while year_l <= max_year_in
loop
pipe row(date_l);
date_l := date_l + 1;
year_l := extract ( year from date_l );
end loop;
return;
end all_dates;
/
select
to_char(x.object_value, 'yyyymmdd') as my_date_id,
x.object_value as datetime_start
from table ( all_dates (2019) ) x;
/
add a comment |
Your Answer
StackExchange.ifUsing("editor", function ()
StackExchange.using("externalEditor", function ()
StackExchange.using("snippets", function ()
StackExchange.snippets.init();
);
);
, "code-snippets");
StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "1"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);
else
createEditor();
);
function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53289070%2fpopulate-future-dates-in-oracle-table%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
A pipelined function might help you here.
- Create a table type that will match the results your function will return.
- Create a function which returns exactly the dates you want. It can run queries to make sure the date isn't already in your table, is within your desired date range, etc.
- Return the values one by one stopping once you hit your criteria.
- Select from the function using the TABLE() function to turn the results into a table you can query. Use the OBJECT_VALUE to access the actual value being returned (since it doesn't really have a column name).
create or replace type date_tbl_t as table of date;
/
create or replace function all_dates ( max_year_in in integer )
return date_tbl_t
pipelined
as
date_l date;
offset_l pls_integer := 0;
year_l integer;
begin
if date_l is null
then
date_l := sysdate;
end if;
year_l := extract ( year from date_l );
while year_l <= max_year_in
loop
pipe row(date_l);
date_l := date_l + 1;
year_l := extract ( year from date_l );
end loop;
return;
end all_dates;
/
select
to_char(x.object_value, 'yyyymmdd') as my_date_id,
x.object_value as datetime_start
from table ( all_dates (2019) ) x;
/
add a comment |
A pipelined function might help you here.
- Create a table type that will match the results your function will return.
- Create a function which returns exactly the dates you want. It can run queries to make sure the date isn't already in your table, is within your desired date range, etc.
- Return the values one by one stopping once you hit your criteria.
- Select from the function using the TABLE() function to turn the results into a table you can query. Use the OBJECT_VALUE to access the actual value being returned (since it doesn't really have a column name).
create or replace type date_tbl_t as table of date;
/
create or replace function all_dates ( max_year_in in integer )
return date_tbl_t
pipelined
as
date_l date;
offset_l pls_integer := 0;
year_l integer;
begin
if date_l is null
then
date_l := sysdate;
end if;
year_l := extract ( year from date_l );
while year_l <= max_year_in
loop
pipe row(date_l);
date_l := date_l + 1;
year_l := extract ( year from date_l );
end loop;
return;
end all_dates;
/
select
to_char(x.object_value, 'yyyymmdd') as my_date_id,
x.object_value as datetime_start
from table ( all_dates (2019) ) x;
/
add a comment |
A pipelined function might help you here.
- Create a table type that will match the results your function will return.
- Create a function which returns exactly the dates you want. It can run queries to make sure the date isn't already in your table, is within your desired date range, etc.
- Return the values one by one stopping once you hit your criteria.
- Select from the function using the TABLE() function to turn the results into a table you can query. Use the OBJECT_VALUE to access the actual value being returned (since it doesn't really have a column name).
create or replace type date_tbl_t as table of date;
/
create or replace function all_dates ( max_year_in in integer )
return date_tbl_t
pipelined
as
date_l date;
offset_l pls_integer := 0;
year_l integer;
begin
if date_l is null
then
date_l := sysdate;
end if;
year_l := extract ( year from date_l );
while year_l <= max_year_in
loop
pipe row(date_l);
date_l := date_l + 1;
year_l := extract ( year from date_l );
end loop;
return;
end all_dates;
/
select
to_char(x.object_value, 'yyyymmdd') as my_date_id,
x.object_value as datetime_start
from table ( all_dates (2019) ) x;
/
A pipelined function might help you here.
- Create a table type that will match the results your function will return.
- Create a function which returns exactly the dates you want. It can run queries to make sure the date isn't already in your table, is within your desired date range, etc.
- Return the values one by one stopping once you hit your criteria.
- Select from the function using the TABLE() function to turn the results into a table you can query. Use the OBJECT_VALUE to access the actual value being returned (since it doesn't really have a column name).
create or replace type date_tbl_t as table of date;
/
create or replace function all_dates ( max_year_in in integer )
return date_tbl_t
pipelined
as
date_l date;
offset_l pls_integer := 0;
year_l integer;
begin
if date_l is null
then
date_l := sysdate;
end if;
year_l := extract ( year from date_l );
while year_l <= max_year_in
loop
pipe row(date_l);
date_l := date_l + 1;
year_l := extract ( year from date_l );
end loop;
return;
end all_dates;
/
select
to_char(x.object_value, 'yyyymmdd') as my_date_id,
x.object_value as datetime_start
from table ( all_dates (2019) ) x;
/
edited Nov 13 '18 at 21:22
answered Nov 13 '18 at 21:14
Jon TheriaultJon Theriault
11314
11314
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53289070%2fpopulate-future-dates-in-oracle-table%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
How about adding a where clause -
WHERE TO_NUMBER (TO_CHAR (mydate, 'yyyymmdd')) NOT IN (SELECT my_Date_id from my_Date);
– rs.
Nov 13 '18 at 20:36
Add some sample table data and the expected result - all as formatted text, not images. (Take a look at stackoverflow.com/help/mcve before you spend too much time.)
– jarlh
Nov 13 '18 at 21:00