1

我正在创建一个涉及一些时间戳的视图。

我有一个带有时间戳的表 A。视图将处理时间戳以查看每个时间戳是否在特定范围内(上午 9 点 - 下午 5 点)。如果时间戳在该范围内,我将在另一个表 (B) 中获取与确切时间匹配的数据。否则,我将获取第二天(或当天)的第一个有效时间(即上午 9 点)以及从那里获取的相应数据。

例子:

  • 时间戳为12/28/2012 17:01-> 的记录从 B 获取数据 for 12/29/2012 09:00,将标志设置为after
  • 时间戳为12/28/2012 08:59-> 的记录从 B 获取数据 for 12/28/2012 09:00,将标志设置为before
  • 时间戳为12/28/2012 09:55-> 的记录从 B 获取数据 for 12/28/2012 09:55,将标志设置为null

这是我到目前为止所拥有的(不工作,有些是伪代码)。我主要不知道如何根据比较设置标志,然后根据标志对 b 执行下一个操作 - 全部在一个语句中。

CREATE VIEW C as 
SELECT time, (CASE WHEN (time< '9:00' ) THEN'before'
CASE WHEN(time> '17:00') THEN'after' else null END) AS flag FROM A

//These two should be combined into one create view statement
//The below is utterly wrong, I know, but explains what I mean
SELECT(
CASE WHEN (flag=='before') THEN SELECT * FROM B WHERE B.time = time set hour='9:00'
CASE WHEN(flag=='after') THEN SELECT* FROM B WHERE B.time = time + one day set hour='9:00'
ELSE SELECT* FROM B WHERE B.time = time ) as data
4

1 回答 1

1

使用这个小提琴测试:http ://sqlfiddle.com/#!2/15be5/50

SELECT
  q.time as original_time_check,
  q.flag as flag_check,
  case q.flag
    when 'before' then q.NINE_AM_ON_THE_DAY 
    when 'after' then q.NINE_AM_THE_NEXT_DAY 
    else q.time
  end as time


FROM
(
    SELECT
       time,
       date(time) + INTERVAL 9 HOUR as NINE_AM_ON_THE_DAY,
       date(time) + INTERVAL '1 9' DAY_HOUR as NINE_AM_THE_NEXT_DAY,  
       case
         when time < (date(time) + INTERVAL 9 HOUR) then 'before'
         when time < (date(time) + INTERVAL 17 HOUR) then 'in-range'
         else 'after'
       end as flag
    FROM 
       Your_table 
) q
于 2013-04-01T05:16:52.213 回答