我想让它在 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,但我希望我的查询是动态且智能的。
解决方案如下:
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 中存在间隔类型。 感谢此页面对我的帮助:
如果我理解正确的话,你想将间隔乘以某个数字。 不管你信不信,这实际上就是你需要做的所有事情:
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“备忘单”中已经有这个小例子很长一段时间了。
两点备注:
在 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
如果我没记错的话,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;