如何使用非空约束postgres合并时间戳

时间:2017-01-10 07:01:11

标签: postgresql timestamp coalesce notnull

insert into employee(eid,dojo) SELECT
    14,coalesce(to_char(dojo,'dd-mm-yyyy'),'')  
        from employee;

我必须通过从表中选择它来插入表,我的列dojo没有空约束,并且时间戳不允许''如果时间戳从选择查询

为空,请插入请提供备用

3 个答案:

答案 0 :(得分:0)

您可以使用某些默认日期值,例如1st jan 1900或< img src="cid:src/resources/imageContent.jpg" /> 您的查询应该像

now()

答案 1 :(得分:0)

您当前的查询有几个问题,其中两个我认为我的答案可以解决。首先,您尝试插入空字符串''来处理NULL列中的dojo值。这不起作用,因为空字符串不是有效的时间戳。正如其他人所指出的,一种解决方案是使用current_timestamp作为占位符。

您遇到的另一个问题是您错误地使用to_char格式化时间戳数据。 to_char的输出是一个字符串,你使用它的方式会导致Postgres拒绝它。相反,您应该使用to_timestamp(),它可以解析字符串并返回时间戳。以下是我认为你打算做的事情:

insert into employee (eid, dojo)
select 14, coalesce(to_timestamp(dojo, 'DD/MM/YYYY HH:MI:SS PM'), current_timestamp)
from employee;

这假设您的时间戳数据格式如下:

DD/MM/YYYY HH:MI:SS PM   (e.g. 19/2/1995 12:00:00 PM)

我也不清楚为什么要插回到具有不可用数据的employee表中,而不是插入到新表中。如果您选择重复使用employee,则可能希望稍后清除错误数据。

答案 2 :(得分:0)

不存在非空但空白的时间戳记。 NULL =空白。

除了存储有效的时间戳记或为null之外,您几乎无能为力。由于您具有非null约束,因此唯一的选择是选择一个您认为“空白”的默认时间戳。

使用硬编码日期指示空白值是一个可怕的可怕想法。如果为空,请删除not null约束,使其为null并继续。

我并不想屈服,但我认为您不了解null。看到这里

https://en.wikipedia.org/wiki/Null_(SQL)