2013-09-29 31 views
0

我試圖讓我的客戶的出生日期,但與當前的一年(sysdate)。例如,John Brown出生於01-JAN-65,我想創建一個查詢,從John的生日中檢索前一個星期一和下一個星期天,以便客戶可以看到他們的優惠券在七天的時間範圍內有效。所以對於約翰·布朗,該列就會有三列如何確定當年的出生周7天優惠券

FullName,  Monday   Sunday 
John Brown  31-DEC-2012 06-JAN-2013 

我的表的定義是:

表名 - 客戶

Customer_ID 
First_Name 
Last_Name 
DOB 
Phone 

我已閱讀Oracle數據庫11g的第5章「存儲和處理日期和時間」,但沒有找到解決我的問題。請幫忙,謝謝。我會發送5美元到您的貝寶電子郵件作爲幫助我的感謝,我正在努力學習。

我試圖從How do I get the current year using SQL on Oracle?執行的代碼,但我不斷收到錯誤

回答

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爲您的測試。

+0

非常感謝你,這個解決方案很有效。請按照承諾向我發送您的PayPal電子郵件。再次感謝=) –

+0

我很樂意提供幫助,無需PayPal。我爲所有幫助過我的人做過。通過它,請幫助另一個。 – bdeem

+0

@JamesHenrick - 如果你還願意花5美元,可以考慮將它發送給'SQL Fiddle'的作者。在右上角有一個「捐贈」按鈕。 –

1

一個查詢使用Oracle的TO_CHARTO_DATENEXT_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與我的測試數據。

+0

但是如果生日是在29-FEB怎麼辦? http://sqlfiddle.com/#!4/8f0c1/1 –

+0

@ A.B.Cade - 是的。你肯定有一點在這裏。我字面上遵循OP的邏輯,並沒有考慮這種情況。 –

+0

已捐贈,謝謝你回答PM 77-1 –