sql—选择时间戳中的范围并创建包含相应年份的新列

svujldwt  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(225)

我想从datetime列中选择2个时间戳之间的范围,创建新的列cropyear并对第一个选定范围应用2019,对第二个选定范围应用2020。
期望输出:

DateTime                  CropYear

'2018-11-16 00:00:00'       2019
...                         2019
'2019-10-14 23:59:59'       2019
'2019-10-15 00:00:00'       2020
...                         2020

* CURRENT_TIMESTAMP()*       2020

我尝试了此查询,但case似乎不支持时间戳:

select SerialNumber, DateTime,
case DateTime
when DateTime BETWEEN '2018-11-16 00:00:01' AND '2019-10-14 23:59:59' then 2019
when DateTime BETWEEN '2019-10-15 00:00:00' AND CURRENT_TIMESTAMP() then 2020
else "error"
end
as CropYear
from `xx.yyy`
lrpiutwd

lrpiutwd1#

用偏移量提取年份函数怎么样?

with t as(
      select timestamp('2018-11-16 00:00:00') as dt union all
      select timestamp('2019-10-14 23:59:59') union all
      select timestamp('2019-10-14 00:00:00') union all
      select timestamp('2019-10-15 00:00:00') union all
      select timestamp('2019-10-16 00:00:00') union all
      select current_timestamp
     )
select t.*,
       extract(year from timestamp_add(dt, interval 78 day)
              ) as crop_year
from t;

这样就不需要 case 表情。
“78”天是一个神奇的天数。把它加到10月15日,你就得到了次年的1月1日。
有一点与问题没有直接关系,那就是要小心。 TIMESTAMP 在bigquery中是utc(基本上认为是伦敦时间)。我猜你更关心某个特定的时区。如果时区是一个问题,那么问一个新问题。

相关问题