【问题标题】:column is of type timestamp without time zone but expression is of type integer列是没有时区的时间戳类型,但表达式是整数类型
【发布时间】:2015-11-09 03:20:05
【问题描述】:

我收到如下错误消息,当我像其他人一样创建此表时设置列时间戳timestamp without time zone NOT NULL,但是当我尝试将2015-08-16 18:51:05 插入此表时,我得到错误,但其他表工作,为什么以及如何解决?

CREATE TABLE IF NOT EXISTS "UserForgetPasswordPending"(
"UserForgetPasswordPendingId" SERIAL NOT NULL,
"Email" varchar(50) NOT NULL,
"TokenTimestamp" timestamp without time zone NOT NULL,
"Token" varchar(100) NOT NULL,
PRIMARY KEY ("UserForgetPasswordPendingId")
);
ALTER TABLE "UserForgetPasswordPending"
  OWNER TO db_admin;

错误

[error: column "TokenTimestamp" is of type timestamp without time zone but expression is of type integer]
  name: 'error',
  length: 216,
  severity: 'ERROR',
  code: '42804',
  detail: undefined,
  hint: 'You will need to rewrite or cast the expression.',

插入

var utc = moment(new Date()).unix();
var tokenTimestamp = moment.unix(utc).format('YYYY-MM-DD HH:mm:ss');

var upsertUserForgetPasswordPending = function(userEmail, tokenTimestamp, token) {
  return new Promise(function (fulfill, reject){
    var queryInsert = 'INSERT INTO "UserForgetPasswordPending" ("Email","TokenTimestamp","Token") SELECT $1,2,$3';
    var queryUpsert = 'UPDATE "UserForgetPasswordPending" SET "TokenTimestamp" = $2, "Token" = $3 WHERE "Email" = $1';
    var query = 'WITH upsert AS ('+queryUpsert+' RETURNING *) '+queryInsert+' WHERE NOT EXISTS (SELECT * FROM upsert)';
console.log(tokenTimestamp);
    dbClient.query(query, [userEmail,tokenTimestamp,token], function(error, result) {
      if (error) {
        reject(error);
      } else {
        fulfill(result);
      }
    });
  });
};

【问题讨论】:

  • 请显示您正在使用的准确 insert 语句。不相关,但是:使用带引号的标识符通常会产生比它们值得的问题更多的问题。
  • @a_horse_with_no_name 我更新了我使用的插入函数,引用标识符是什么意思?你的意思是在查询中我使用类似 CREATE TABLE IF NOT EXISTS "UserForgetPasswordPending" .. 的东西吗?那是因为我使用大写命名...
  • 那是什么编程语言?变量tokenTimestamp 是什么数据类型?好像你在那里传递一个整数值,而不是时间戳。我指的是在标识符周围使用双引号,这使得它们区分大小写。从长远来看,这通常会产生更多值得的问题(有些人首先质疑引用标识符的“价值”)。
  • 我不知道 JavaScript 是如何传递变量的,用普通的 SQL 写就可以了:sqlfiddle.com/#!15/bfd35/1 可能是因为你在 INSERT 语句中使用了select 而不是values,但是我不知道 JavaScript 是否会以某种方式搞砸。
  • 你打错了:SELECT $1,2,$3 应该是SELECT $1,$2,$3

标签: javascript sql node.js postgresql


【解决方案1】:

这是因为您将整数数据插入time stamp 列。

更正以下语法:

var queryInsert = 'INSERT INTO "UserForgetPasswordPending ("Email","TokenTimestamp","Token") SELECT $1,2,$3';

在上述查询中,您为 TokenTimestamp 选择了 2,这就是您收到此错误的原因。

您应该将2 替换为某种日期时间格式yyyy-mm-dd hh:mm:ss

例如:'2015-08-07 05:00:01'

【讨论】:

  • 我认为它更简单:它应该是 $2,即准备好的语句的第二个参数,如 UPDATE 查询中所示。
  • 请注意日期时间格式区分大小写,请使用 yyyy-MM-dd hh:mm:ss 而不是 yyyy-mm-dd hh:mm:ss
【解决方案2】:

对我来说,类型转换明确有效。 请注意,我使用了 joda Datetime

@CreatedDate
@Column(name = "created_on", updatable = false, nullable = false)
@Type(type = "org.jadira.usertype.dateandtime.joda.PersistentDateTime")
private DateTime createdOn;

【讨论】:

    猜你喜欢
    • 2020-02-17
    • 2015-11-26
    • 2019-11-08
    • 2021-06-18
    • 2023-03-14
    • 2021-12-27
    • 1970-01-01
    • 2018-12-31
    • 1970-01-01
    相关资源
    最近更新 更多