【问题标题】:How to select date and time less than a timestamp?如何选择小于时间戳的日期和时间?
【发布时间】:2019-07-26 13:56:52
【问题描述】:

我正在进行连接,并且必须选择日期和时间小于特定日期和时间的行。我的表中有一个日期和时间列(组合),称为“小时”。

我正在尝试将字符串转换为 where 子句中的时间戳(通过使用 to_timestamp)。如果将 where 子句更改为选择查询,则它本身就完美无缺。但是在我的代码中使用(join)时,会导致语法错误。

Select 
t1.revenue,
t2.impressions

from t1
left join t2 on t1.id = t2.id

where t2.hour < to_timestamp('2019-07-24 23:59:59','YYYY-MM-DD HH24:MI:SS')

我的“where”子句附近出现语法错误。

【问题讨论】:

标签: sql postgresql


【解决方案1】:

语法错误可能是由SELECT 子句中缺少逗号引起的。但除此之外,您的查询还有其他问题。考虑这个更新版本:

select 
    t1.revenue,
    t2.impressions
from t1
left join t2
    on t1.id = t2.id and
       t2.hour < '2019-07-24 23:59:59'::timestamp;

鉴于您正在进行从t1t2 的左连接,当前出现在WHERE 子句中的t2 的限制很可能应该移至连接的ON 子句。不这样做可能意味着过滤掉来自t1 的记录,这会破坏左连接的目的。

另外请注意,您可以只使用::timestamp 将字符串文字转换为时间戳,但您甚至可能不需要这样做。

【讨论】:

  • 您好!我已经编辑了逗号,我只是在写下我的问题时犯了这个错误。
  • 我不太了解从 t1 部分过滤掉记录的部分。我认为在左连接中,不会过滤来自 t1 的记录。 where 条件仅将 t2 中将要加入的条目列入候选名单。
  • 完全不正确。您当前的 WHERE 子句绝对可以删除任何与一小时不匹配的 t1 记录。
  • t1 中没有“小时”列。这就是为什么我对 t2 中的过滤时间如何从 t1 中删除条目感到困惑
  • 假设t1 中的每条记录最多只能匹配t2 中的一条记录。然后发生连接,然后应用WHERE 子句。如果您在WHERE 子句中对t2.hour 施加限制,那么t1 中任何不符合小时要求的记录都将被删除。这可能发生在不匹配的连接 但具有错误 t2.hour 值的匹配连接上。我的版本保证每条t1 记录都会出现在结果集中。
【解决方案2】:

您的问题是,SELECT 子句中缺少逗号“,”。

【讨论】:

    猜你喜欢
    • 2013-11-17
    • 1970-01-01
    • 2015-08-02
    • 2015-10-14
    • 2012-03-06
    • 2023-02-25
    • 1970-01-01
    • 2013-06-26
    • 2014-03-05
    相关资源
    最近更新 更多