如何选择小于时间戳的日期和时间?

Posted

技术标签:

【中文标题】如何选择小于时间戳的日期和时间?【英文标题】: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”子句附近出现语法错误。

【问题讨论】:

Postgres?还是 mysql t1.revenue 后缺少逗号? 见:Why should I provide an MCVE for what seems to me to be a very simple SQL query? @Strawberry 无需反对。这是一个 Postgres 问题。 @TimBiegeleisen 有各种需要。 【参考方案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 子句中缺少逗号“,”。

【讨论】:

以上是关于如何选择小于时间戳的日期和时间?的主要内容,如果未能解决你的问题,请参考以下文章

MySQL日期和时间戳的转换

我如何将 Bootstrap 3 Datepicker 自定义为仅没有时间戳的日期

MySQL日期和时间戳的转换

如何仅绘制时间戳的时间部分,包括日期?

用于将日期和时间列转换为 .csv 中的 unix 时间戳的 Bash 脚本

Java程序获取没有时间戳的当前日期