如果我有两个表:
成员:
CREATE TABLE members
(member_id number,
lastname varchar2(10),
firstname varchar2(10),
license# number(9),
ST char(2),
credit_card number(12));
INSERT INTO members VALUES(10, 'Tangier', 'Tim', 111111111, 'VA', 123456789111);
INSERT INTO members VALUES(12, 'Maulder', 'Fox', 333333333, 'FL', 333333333333);
INSERT INTO members VALUES(13, 'Wild', 'Coyote', 444444444, 'VA', 444444444444);
INSERT INTO members VALUES(14, 'Joan', 'Casteel', 555555555, 'FL', 555555555555);
和租金:
CREATE TABLE rental
(rental_id number(2),
rent_date date,
return_date date,
pay_method varchar2(10),
movie_id number,
member_id number);
INSERT INTO rental VALUES(1, '18-SEP-09', '1-OCT-09', 'Credit', 11, 10);
INSERT INTO rental VALUES(2, '18-SEP-09', '3-OCT-09', 'Credit', 8, 10);
INSERT INTO rental VALUES(3, '11-OCT-09', '19-OCT-09', 'Check', 6, 12);
INSERT INTO rental VALUES(4, '28-OCT-09', '31-OCT-09', 'Debit', 3, 13);
INSERT INTO rental VALUES(5, '28-OCT-09', '5-NOV-09', 'Debit', 5, 13);
INSERT INTO rental VALUES(6, '29-OCT-09', '11-NOV-09', 'Debit', 11, 13);
INSERT INTO rental VALUES(7, '1-NOV-09', '11-NOV-09', 'Credit', 10, 14);
INSERT INTO rental VALUES(8, '2-NOV-09', '10-NOV-09', 'Credit', 12, 14);
INSERT INTO rental VALUES(9, '5-NOV-09', NULL, 'Cash', 4, 12);
INSERT INTO rental VALUES(10, '8-NOV-09', '18-NOV-09', 'Cash', 12, 12);
INSERT INTO rental VALUES(11, '14-NOV-09', NULL, 'Cash', 3, 12);
INSERT INTO rental VALUES(12, '18-NOV-09', NULL, 'Debit', 11, 13);
如何显示租赁日期和归还日期之间的周数?如果为NULL,则在名为"delay_weeks"的新列中将返回日期设置为"2009年12月1日",该列应四舍五入为整数。然后还有一个名为"Status"的新列,显示每个事务是否已返回。
这是一道家庭作业题,但我似乎做不对。我们应该只使用一个SQL语句。
到目前为止,我已经尝试了以下内容,我认为这几乎是正确的,但我得到了错误:";MEM"RENTAL_ID":无效标识符。
SELECT mem.member_id AS member_id,
ren.rental_id AS rental_transaction_id,
case
when ren.return_date IS NULL
THEN ROUND(TO_DATE('01-dec-2009','dd-mm-yyyy')-TO_DATE(ren.rent_date, 'dd-mm-yyyy'))
ELSE ROUND(TO_DATE(ren.return_date, 'dd-mm-yyyy')-TO_DATE(ren.rent_date, 'dd-mm-yyyy'))
END AS delay_weeks,
CASE
WHEN ren.return_date IS NULL
THEN 'not return'
ELSE 'return'
END AS status
FROM members mem
JOIN rental ren ON mem.member_id = ren.member_id
order BY member_id;
如有任何指导,我们将不胜感激。如果需要澄清,请告诉我。TIA。
您可以减去日期,用'Dec 1, 2009'
日期代替NULL
return_date
s,然后除以7:
select m.member_id, r.rental_id, floor(((case when r.return_date is null then to_date('01-DEC-09') else r.return_date end) - r.rent_date)/7) weeks
from rental r join members m on r.member_id = m.member_id;
不要对已经是日期的值调用TO_DATE
;如果你修复了它,那么你就会得到代码:
case
when ren.return_date IS NULL
THEN ROUND(TO_DATE('01-dec-09','dd-mm-yyyy')-ren.rent_date)
ELSE ROUND(ren.return_date-ren.rent_date)
END AS delay_weeks,
如果运行该程序,则会突出显示下一个问题,即TO_DATE('01-dec-09','dd-mm-yyyy')
预计年份为4位数,但您只提供了2位数,因此您将获得公元9年,而不是2009年(以及大约-730461
天的差异(。最好的解决方案是使用日期文字(而不是尝试从字符串转换(:
case
when ren.return_date IS NULL
THEN ROUND(DATE '2009-12-01'-ren.rent_date)
ELSE ROUND(ren.return_date-ren.rent_date)
END AS delay_weeks,
然后可以使用COALESCE
函数而不是CASE
表达式来简化它:
ROUND(COALESCE(ren.return_date, DATE '2009-12-01') - ren.rent_date)
AS delay_weeks,
然后,当你减去两个日期时,你会得到以天(而不是周(为单位的差异,所以你需要除以7:
SELECT mem.member_id AS member_id,
ren.rental_id AS rental_transaction_id,
ROUND((COALESCE(ren.return_date, DATE '2009-12-01') - ren.rent_date)/7)
AS delay_weeks,
CASE
WHEN ren.return_date IS NULL
THEN 'not return'
ELSE 'return'
END AS status
FROM members mem
JOIN rental ren ON mem.member_id = ren.member_id
order BY member_id;
如果您只想计算完整的周数,那么您需要使用FLOOR
。如果要计算零件周数,请使用CEIL
;如果要计算到最近的周数,则使用ROUND
。我假设你想要FLOOR
或CEIL
而不是ROUND
,但这个要求的问题还不清楚。
db<gt;小提琴这里