6

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

4

3 回答 3

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

于 2013-06-14T12:01:34.707 回答
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“备忘单”中有这个小例子已经有一段时间了。

于 2013-06-14T00:05:59.457 回答
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
    
于 2013-06-27T12:23:56.143 回答