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

时间:2013-06-13 21:09:40

标签: teradata

我想在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,但我希望我的查询是动态且智能的。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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的“备忘单”中已经有了这个小小的例子了很长一段时间。

答案 2 :(得分: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