SQL

时间:2015-11-25 16:53:27

标签: sql oracle

我尝试运行一个简单的查询来根据一个日期计算什么是提醒(enrollment_date。)这是从注册日期开始每90天重复一次的事件,但我们的员工只需要看下一个可能的日期。因此,如果一个日期是在十二月,他们将只看到该日期,直到它通过,然后只看到该日期过后的下一个。那可能吗?我正在使用oracle sql

所有可见的是:

2015年12月12日之前

Client          Next Inquiry Date
Client A        December 12, 2015

2015年12月12日之后

Client         Next Inquiry Date
Client A       March 11 2016

它并不多,但这是我到目前为止所做的。

SELECT 
    client_name, enrollment_date,
    CASE 
        WHEN CURRENT_DATE <= DATE(day, 90, nextdue_date)

2 个答案:

答案 0 :(得分:0)

我认为您的方案仍有不少未知数,但这是一个示例(对于SQL Server),它将向您显示下一个100个90天的提醒。您可以使用CTE生成每个客户端的提醒日期列表,然后使用该列表中的MIN为每个仍然大于当前日期的客户端。

DECLARE @enroll_date DATE = '2015-12-12' --For testing
--DECLARE @enroll_reminder DATE = DATEADD(DAY, 90, @enroll_date) 

;WITH cte AS (

SELECT 1 AS count_

UNION ALL 

SELECT count_+1
FROM cte
WHERE count_<100
)

SELECT 
  'Client A'--replace with your column name
 ,MIN(DATEADD(DAY, 90*count_, @enroll_date)) AS test

FROM cte

--GROUP BY your_column_name

HAVING MIN(DATEADD(DAY, 90*count_, @enroll_date)) > GETDATE()

在这种情况下,下一个提醒是2016-03-11,然后当那天通过时它将显示2016-06-09,然后是2016-09-07等。

答案 1 :(得分:0)

检查这是否适合您... 由于这是Oracle(PL / SQL),因此我们无法使用TOP 1,因此使用ROWNUM属性。

SELECT client_name as "Client"
     , enrollment_date as "Next Inquiry Date"
  FROM <table_name>
 WHERE enrollment_date < (SYSDATE + 90)
  AND ROWNUM = 1
ORDER BY enrollment_date