【问题标题】:How to join a SQL (Teradata) query with time condition?如何加入带有时间条件的 SQL (Teradata) 查询?
【发布时间】:2020-04-05 12:34:33
【问题描述】:

我正在尝试捕获包括今天在内的每一封电子邮件,直到第二天上午 10.30。我知道我要在我的加入中添加逻辑,但我不确定我做得是否正确。请问有人可以告诉这是正确的还是有更好的方法来做到这一点?

我尝试添加到 JOIN 中的内容

LEFT JOIN events  b ON a.signup_dt BETWEEN b.mst_dt  AND  b.mst_dt +1 AND Extract(HOUR From  b.mst_dt+1) <= 9 
AND a.email_address = b.email_address

活动日期(我有电子邮件地址列,但此处未包含) enter image description here

Ops 表中的日期(我有一个名为 signup_dttm 的日期时间列) enter image description here

澄清 - 在我的操作表上,我有特定日期的所有电子邮件捕获。我们将为从 Ops 表中捕获的每封电子邮件发送一封信息电子邮件。该数据(即我们在 Ops 表中发送的电子邮件以及日期和时间)存储在事件表中。例如,我们昨天(2019 年 12 月 11 日)捕获了 500 封电子邮件。然后我们昨天发送了 400 封信息电子邮件。剩下的其他 100 封电子邮件我们将在今天(2019 年 12 月 12 日)上午 10.30 之前的某个时间发送。同样,那些发送数据将存储在事件表中。这就是为什么我要尝试捕获从昨天到今天上午 9 点的所有内容并加入 ops 表的原因。希望这会有意义,如果不是请告诉我。任何帮助都将受到高度赞赏。

非常感谢

【问题讨论】:

  • 不确定我是否遵循这里的所有内容,但我认为您需要使用 OR 来处理您的 2 个日期。按照您现在的方式,您将两天的时间限制在 AND (signup_dt = b.mst_dt OR (a.signup_dt = b.mst_dt + 1 and extract(hour...))
  • @Andrew 非常感谢您的评论。这个逻辑是否给了我这个,例如昨天到今天早上 9 点。 2019 年 12 月 11 日到 2019 年 12 月 12 日上午 9 点之间的动态日期是什么意思?
  • 是的,就是这样。按照您目前的方式,您只能在 11 日上午 9 点之前和 12 日上午 9 点之前获得所有内容。除非我误会了,否则您希望在 11 日的每一天以及 12 日上午 9 点之前的所有时间。
  • @Andrew 谢谢,我想要 11 日的所有内容,以及 12 日上午 9 点之前的所有内容。这行得通吗?很抱歉,如果我让你感到困惑。如果这是正确的,请作为答案,以便我选择它。非常感谢您的帮助
  • @Andrew 我想要其他方式。我想要 11 日的所有内容,以及 12 日上午 9 点之前的所有内容。对困惑感到抱歉。我该怎么做呢?谢谢

标签: sql database join left-join teradata


【解决方案1】:

您可以使用INTERVAL 作为您的加入条件:

a.signup_dt BETWEEN 
  CAST(b.mst_dt AS TIMESTAMP(0)) AND -- Current day
  (CAST(b.mst_dt AS TIMESTAMP(0)) + INTERVAL '1 09' DAY TO HOUR) -- 9am next day

【讨论】:

  • 如果是 DATE,您需要将其转换为 TIMESTAMP,您不能将 HOURs 添加到 DATE。并且必须是两位数的小时:INTERVAL '1 09' DAY TO HOUR
  • 你说得对,我最初将它作为时间戳记在那里,但后来重新阅读了最初的帖子并取出了 CAST。会修改的,谢谢。
  • @ravioli 非常感谢您对我的帮助。感谢您的宝贵时间和帮助
猜你喜欢
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 2018-02-25
  • 2017-01-10
  • 2020-07-13
  • 1970-01-01
  • 2021-10-23
  • 2021-12-27
相关资源
最近更新 更多