PostgreSQL比较varchar和时间类型

时间:2018-11-19 22:40:40

标签: sql postgresql

在PostgreSQL中,我需要在两个数据类型不同的列之间建立一个LEFT JOIN。其中一个是varchar,另一个是time

LEFT JOIN my_table ON r.varchar_time = my_table.time

如何通过使用to_char比较它们?

2 个答案:

答案 0 :(得分:1)

Postgres具有转换from one datatype to another的功能。从文档中:

to_timestamp(text, text),带有时区的时间戳,将字符串转换为时间戳

示例:to_timestamp('05 Dec 2000', 'DD Mon YYYY')

您的代码可能看起来像这样,无论您使用哪种格式来匹配另一列。

LEFT JOIN my_table ON to_timestamp(r.varchar_time, 'HH:mm:ss') = my_table.time

答案 1 :(得分:1)

类型转换可以使用缩写语法,例如::time,因此,您可以使用:

LEFT JOIN my_table ON r.varchar_time::time = my_table.time

但是,如果有任何未转换为时间的值可能会出错。您可能会朝相反的方向前进,但是现在您必须确保varchar转换产生的格式与另一列的格式匹配。

LEFT JOIN my_table ON r.varchar_time = my_table.time::varchar

无论哪种方式,您都有潜在的问题。理想情况下,varchar列也应该是时间。

我看到的另一个可能的问题是时间精度也可能是一个问题,但这取决于您如何填充列。

测试:

select
      (current_timestamp::time)::varchar "varchar"
     , current_timestamp::time "time"

+-----------------+------------------+
|     varchar     |       time       |
+-----------------+------------------+
| 00:50:20.703713 | 00:50:20.7037130 |
+-----------------+------------------+

从该测试中您可以看到,varchar数据的“格式”很重要