如何使用计算间隔添加/减去日期/时间组件?

问题描述 投票:0回答:4

我想让它在 Teradata 中运行:

更新了 SQL 以获得更好的示例

select
case
    when 
        current_date between
        cast('03-10-2013' as date format 'mm-dd-yyyy') and
        cast('11-03-2013' as date format 'mm-dd-yyyy')
    then 4
    else 5
end Offset,
(current_timestamp + interval Offset hour) GMT

但是,我收到错误

Expected something like a string or a Unicode character blah blah
。 看来你必须像这样硬编码间隔:

select current_timestamp + interval '4' day

是的,我知道我在第一个示例中对其进行了硬编码,但这只是为了演示计算结果。

如果您一定知道的话,我必须将几个表中的所有日期和时间转换为 GMT,但我必须考虑夏令时。 我在东部,所以如果日期在 DST 时间范围内,我需要添加 4 小时,否则添加 5 小时。

我知道我可以为每个周期创建单独的更新语句,然后相应地将值从 4 更改为 5,但我希望我的查询是动态且智能的。

teradata
4个回答
5
投票

解决方案如下:

select
case
    when 
        current_date between
        cast('03-10-2013' as date format 'mm-dd-yyyy') and
        cast('11-03-2013' as date format 'mm-dd-yyyy')
    then 4
    else 5
end Offset,
(current_timestamp + cast(Offset as interval hour)) GMT

您必须实际将 case 语句的返回值转换为区间。 我什至不知道 Teradata 中存在间隔类型。 感谢此页面对我的帮助:

http://www.teradataforum.com/l081007a.htm


4
投票

如果我理解正确的话,你想将间隔乘以某个数字。 不管你信不信,这实际上就是你需要做的所有事情:

select  current_timestamp                    as right_now
      , right_now +      (interval '1' day)  as same_time_tomorrow
      , right_now + (2 * (interval '1' day)) as same_time_next_day

出于某种原因,间隔总是对我构成挑战;我不经常使用它们。 但我的 Teradata“备忘单”中已经有这个小例子很长一段时间了。


0
投票

两点备注:

  • 您可以返回 INTERVAL 而不是 INT
  • 在 Teradata 中写入日期文字的推荐方法是 DATE 'YYYY-MM-DD' 而不是 CAST/FORMAT

    select
        case
            when current_date between DATE '2013-03-10' and DATE '2013-11-03'
            then interval '4' hour
            else interval '5'hour
        end AS Offset,
        current_timestamp + Offset AS GMT
    

0
投票

如果我没记错的话,dt 列是多余的,因为日期包含在 dt_tm 中。无论如何,整件事不是关于每个 med_id 和 casemgr_clntid 的第一个 dt,而是关于它们的第一个(即最小值)dt_tm

SELECT
  id1,
  med_id,
  dt,
  dt_tm,
  casemgr_id,
  casemgr_clntid,
  CASE WHEN dt_tm = MIN(dt_tm) OVER(PARTITION BY med_id, casemgr_clntid)
         OR dt_tm >= CAST(MIN(dt_tm) OVER(PARTITION BY med_id, casemgr_clntid) AS DATE)
                     + INTERVAL '181' DAY
    THEN 'valid'
    ELSE 'invalid'
  END AS status
FROM x
ORDER BY med_id, casemgr_clntid, dt_tm;
© www.soinside.com 2019 - 2024. All rights reserved.