如何在PostgreSQL中截断日期?

5
我使用下面的条件在Postgres中截断日期:
to_date(to_char(trunc(appointment_date),'YYYYMMDD')||appointment_end_time,''YYYYMMDDHH24:MI:SS')AS tq

我该如何在PostgreSQL中使用这个?

appointment_dateappointment_end_time 是哪种数据类型?你想要做什么呢?是从 datetime 值中创建一个 timestamp 吗? - user330315
预约日期是时间戳(timestamp)类型,没有时区信息,而预约结束时间是字符变量(character varying)类型...我想选择这些字段。 - v bhosale
1
为什么要将时间值存储在 varchar 列中?这是一个非常糟糕的想法。 - user330315
2个回答

5
奇怪的数据类型有时需要奇怪的、至少看起来奇怪的查询。请尝试(参见 fiddle)。
date_trunc('day',appointment_date) 
       + substr(appoinment_end,12)::interval

4
由于您的`to_char()`调用使用格式`'HH24:MI:SS'`来表示“时间”列,因此您可以直接将该列转换为时间值,例如使用`::`运算符:`appointment_end_time::time`。
要从`appointment_date`的日期部分和时间值构建新的时间戳,请将它们相加。
appointment_date::date + appointment_end_time::time

首先将时间戳转换为日期(不包括时间),然后将时间值加入其中,这会产生一个时间戳
请注意,to_date() 返回一个 date,因此您的代码将再次删除刚刚添加的时间部分。如果您确实希望得到时间戳作为结果,则需要使用 to_timestamp()
回答标题为“如何在Postgres中截断日期”的问题(实际上是指timestamp而不是date):您可以将其转换为date(请参见上文),或者您可以使用date_trunc()(而不是trunc())来截断它应该截断的单位。但是,date_trunc返回的是一个时间戳而不是date值,因此您无法向结果添加时间。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接