【问题标题】:how to coalesce timestamp with not null constraint postgres如何使用非空约束postgres合并时间戳
【发布时间】:2017-05-24 14:17:12
【问题描述】:
insert into employee(eid,dojo) SELECT
    14,coalesce(to_char(dojo,'dd-mm-yyyy'),'')  
        from employee;

我必须通过从表中选择它来插入到表中,我的 dojo 列没有空约束,并且时间戳不允许 '' 插入,如果选择查询中的时间戳为空,请为此提供替代方法

【问题讨论】:

  • 错误:类型时间戳的输入语法无效:“”行:1
  • 当我尝试插入时它显示错误,我知道因为时间戳不允许''
  • 请向我们展示来自dojo 列的数据。您当前正尝试将字符数据作为时间戳插入。
  • 19/2/1995 下午 12:00:00。
  • 我正在将时间戳插入到 dojo 中,除非它的 null 我希望它为空但不使用 now()

标签: postgresql timestamp coalesce notnull


【解决方案1】:

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

除了存储有效的时间戳或空值之外,您实际上无能为力。由于您有一个非空约束,您唯一的选择是选择一个您认为“空白”的默认时间戳。

顺便说一句,使用硬编码日期来表示空白值是一个可怕的可怕想法。如果它为空,则删除 not null 约束,使其为 null 并继续。

我并不是要居高临下,但我认为您不了解空值。看这里

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

【讨论】:

    【解决方案2】:

    您当前的查询有几个问题,我认为我的回答可以解决其中两个问题。首先,您尝试插入一个空字符串'' 来处理dojo 列中的NULL 值。这不起作用,因为空字符串不是有效的时间戳。正如其他人指出的那样,一种解决方案是使用 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,您可能希望稍后清除不良数据。

    【讨论】:

    • select查询的员工在其他数据库,插入到其他数据库,两个表的名称和结构相同
    • @DragonWarrior 感谢您的澄清。
    • 新手兄弟!!!函数 to_timestamp(date, unknown) 不存在 Line: 1
    • 我在尝试运行您的查询时遇到此错误
    • 你使用的是什么版本的 Postgres?
    【解决方案3】:

    您可以使用一些默认日期值,例如 1900 年 1 月 1 日或 now() 你的查询应该是这样的

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

    【讨论】:

    • 插入 dd-mm-yyyy 作为时间戳对我来说似乎不合适。
    • 如果它为空,我不想插入值,但希望列 b 为空
    • @TimBiegeleisen 我正要给他写信,但后来想想我是否从他来自 oracle 背景的代码风格上看错了,所以我就这样吧。
    • @DragonWarrior 如果时间戳不为空约束,您不能将列留空
    • 什么可以替代它
    猜你喜欢
    • 1970-01-01
    • 2020-10-16
    • 2021-08-21
    • 1970-01-01
    • 2016-04-09
    • 2020-11-16
    • 2021-09-27
    • 2019-09-24
    • 1970-01-01
    相关资源
    最近更新 更多