查找在Oracle SQL中特定日期发生的下一个生日

时间:2015-10-22 07:55:38

标签: sql oracle date

我有一张学生桌,我需要为每个学生找到他将在周日举行的下一个生日。我怎么能在Oracle Sql中做到这一点?

示例:Bob,在表格中找到的学生有他的dob '23 / 10/1994'。输出将是'23 / 10/2016',因为这是第一个日期(从sysdate开始),它将在周日出现,也将是他的生日。

5 个答案:

答案 0 :(得分:1)

SQL Fiddle

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)