我正在创建一个涉及一些摆弄时间戳的视图。
我有一张带有时间戳的表A.该视图将处理时间戳以查看每个时间戳是否在特定范围内(上午9点至下午5点)。如果时间戳在该范围内,我将获取与另一个表(B)中的确切时间匹配的数据。否则,我将在第二天(或今天)获取第一个有效时间(即上午9点)以及相应的数据。
示例:
12/28/2012 17:01
的记录 - >从B获取数据
对于12/29/2012 09:00
,请将标记设置为after
。12/28/2012 08:59
的记录 - >从B获取数据
对于12/28/2012 09:00
,请将标记设置为before
。12/28/2012 09:55
的记录 - >从B获取数据
对于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
答案 0 :(得分: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