我正在尝试让我的客户出生日期,但是使用当前年份(sysdate)。例如,John Brown出生于01-JAN-65,我想创建一个查询,从John的生日那里检索上周一和下周日,以便客户可以看到他们的优惠券在七天时间框架之间有效。所以对于John Brown来说,这行会有三列
FullName, Monday Sunday
John Brown 31-DEC-2012 06-JAN-2013
我的表定义是:
表名称 - 客户
列
Customer_ID
First_Name
Last_Name
DOB
Phone
我已经阅读了Oracle Database 11g的第5章“存储和处理日期和时间”,但没有找到解决我的问题的方法。请帮忙,谢谢。我将向您的PayPal电子邮件发送5美元作为对我的帮助,我正在努力学习。
我尝试从How do I get the current year using SQL on Oracle?实现代码,但我一直收到错误
答案 0 :(得分:3)
您需要使用NEXT_DAY功能。
with sourceData as (
select 'John Brown' FullName, DATE '1965-01-1' BirthDate
from dual
), BirthDatesThisYear as
(
select
FullName,
Add_Months(BirthDate, (extract(YEAR from sysdate)- extract(YEAR from birthdate))*12) BirthDateThisYear
from sourceData
)
select
FullName,
NEXT_DAY(BirthDateThisYear-8,'MON') PreviousMonday,
NEXT_DAY(BirthDateThisYear-8,'MON')+6 NextSundayFromPrevMonday
from BirthDatesThisYear;
SQL Fiddle用于测试。
答案 1 :(得分:1)
使用Oracle的TO_CHAR
,TO_DATE
和NEXT_DAY
进行一次查询:
SELECT name,
TO_DATE(TO_CHAR(SYSDATE, 'YYYY') || TO_CHAR(birthdate, 'MMDD'), 'YYYYMMDD') "This Birthday",
NEXT_DAY(TO_DATE(TO_CHAR(SYSDATE, 'YYYY') || TO_CHAR(birthdate, 'MMDD'), 'YYYYMMDD'), 'Sun') "Sunday After",
NEXT_DAY(TO_DATE(TO_CHAR(SYSDATE, 'YYYY') || TO_CHAR(birthdate, 'MMDD'), 'YYYYMMDD'), 'Sun') - 6 "Monday Before"
FROM Table1;
这是我的测试数据SQL Fiddle。