我有一张学生桌,我需要为每个学生找到他将在周日举行的下一个生日。我怎么能在Oracle Sql中做到这一点?
示例:Bob,在表格中找到的学生有他的dob '23 / 10/1994'。输出将是'23 / 10/2016',因为这是第一个日期(从sysdate开始),它将在周日出现,也将是他的生日。
答案 0 :(得分:1)
Oracle 11g R2架构设置:
CREATE TABLE Students ( Name, DateOfBirth ) AS
SELECT 'Alice', DATE '1994-10-22' FROM DUAL
UNION ALL SELECT 'Bob', DATE '1994-10-23' FROM DUAL
UNION ALL SELECT 'Carol', DATE '1992-02-29' FROM DUAL;
查询1 :
WITH Dates ( Name, DateOfBirth, Birthday, Incr ) AS (
SELECT Name,
DateOfBirth,
ADD_MONTHS( DateOfBirth, ( EXTRACT( YEAR FROM SYSDATE ) - EXTRACT( YEAR FROM DateOfBirth ) ) * 12 ),
EXTRACT( YEAR FROM SYSDATE ) - EXTRACT( YEAR FROM DateOfBirth )
FROM Students
UNION ALL
SELECT Name,
DateOfBirth,
ADD_MONTHS( DateOfBirth, ( Incr + 1 ) * 12 ),
Incr + 1
FROM Dates
WHERE TO_CHAR( ADD_MONTHS( DateOfBirth, Incr * 12 ), 'DAY' ) <> 'SUNDAY '
)
SELECT Name, DateOfBirth, Birthday
FROM Dates
WHERE TO_CHAR( Birthday, 'DAY' ) = 'SUNDAY '
<强> Results 强>:
| NAME | DATEOFBIRTH | BIRTHDAY |
|-------|----------------------------|----------------------------|
| Bob | October, 23 1994 00:00:00 | October, 23 2016 00:00:00 |
| Alice | October, 22 1994 00:00:00 | October, 22 2017 00:00:00 |
| Carol | February, 29 1992 00:00:00 | February, 28 2021 00:00:00 |
答案 1 :(得分:0)
将DAY
功能与nls_territory = 'AMERICA';
一起使用。
SELECT *
FROM student
WHERE EXTRACT(DAY FROM dob) = 7
nls_territory = 'UNITED KINGDOM';
或
SELECT *
FROM student
WHERE EXTRACT(DAY FROM dob) = 6
student
(假设表名为dob
,生日/出生日期字段称为class DataBaseClass{
public $_host = "localhost";
public $_user = "X32284679";
public $_database = "X32284679";
public $_pass = "X32284679";
function connectToDatabase(){
$conn = new mysqli($this->_host, $this->_user, $this->_pass, $this->_database);
$conn->set_charset("utf8");
return $conn;
if(! $conn) {
echo "Problems with connecting to database!";
exit;
}
}
}
)
答案 2 :(得分:0)
--prepare test data
create table students(name varchar2(50), dob date)
insert into students(name, dob)
select 'Student '||rownum, to_date('1970.12.31','yyyy.mm.dd')-rownum from all_objects
where rownum < 365
--the query
select s.*
,to_char(s.next_dob,'DAY') day_of_week
from (
select st.*
,to_date((extract(YEAR from sysdate) + addyear)*10000+extract(MONTH from dob)*100+extract(DAY from dob),'YYYYMMDD') as next_dob
from students st
,(select rownum -1 as addyear from all_objects where rownum < 9)
)s
where s.next_dob > sysdate
and rtrim(to_char(s.next_dob,'DAY')) = 'SUNDAY'
order by next_dob
答案 3 :(得分:0)
您可以通过select语句替换birthdate并将其保存到new_birthdate。
declare
birthdate DATE:= to_date('10-23-1994', 'mm/dd/RRRR');
yr NUMBER;
new_birthdate DATE;
temp DATE;
X BOOLEAN:=FALSE;
BEGIN
new_birthdate := birthdate; --you can remove this and
--dbms_output.put_line(temp);
while (X = FALSE) loop
new_birthdate:= to_date(TO_CHAR(add_months(new_birthdate,12), 'MM/DD/RRRR'),'mm/dd/RRRR');
temp:=new_birthdate;
dbms_output.put_line(TO_CHAR(TEMP,'DAY'));
IF TRIM(to_char(temp,'DAY')) = 'SUNDAY' AND TEMP > SYSDATE THEN
X:=TRUE;
EXIT;
END IF;
END loop;
dbms_output.put_line(TEMP);
end;
答案 4 :(得分:0)
WITH
params AS (SELECT DATE '1994-10-23' dob
, SYSDATE since_date
, 12 hits
FROM dual)
SELECT next_dob_date
FROM (
SELECT dob + numtoyminterval(LEVEL, 'YEAR') next_dob_date
FROM params CONNECT BY LEVEL < 100
)
WHERE to_char(next_dob_date, 'D', 'NLS_DATE_LANGUAGE=''numeric date language''') = 7
AND next_dob_date >= (SELECT since_date from params)
AND rownum <= (SELECT hits from params)