当某些列为时间戳时,如何插入值?

时间:2018-10-16 10:45:55

标签: postgresql

我有以下SQL语句:

CREATE TABLE account (
user_id serial primary key,
username VARCHAR(50) UNIQUE NOT NULL,
password VARCHAR(50) NOT NULL,
email VARCHAR (355) UNIQUE NOT NULL,
created_on TIMESTAMP NOT NULL,
last_login TIMESTAMP
);

我要插入第一行:

INSERT INTO account VALUES (
1, 'usernamehere', 'password123', 'admin@yahoo.com');

我应该输入什么作为created_on和last_login时间戳列的值?

4 个答案:

答案 0 :(得分:2)

有不同的specify a valid timestamp literal方法。

我更喜欢ANSI SQL文字,例如:

timestamp '2018-10-15 18:49:10'

始终使用ISO时间戳格式(即yyyy-mm-dd和24小时制)。

或者,在Postgres中,您也可以将字符串指定ISO格式的值转换为时间戳:'2018-10-15 18:49:10'::timestamp

如果您喜欢其他格式,则可以将to_timestamp与格式掩码一起使用,例如:

to_timestamp('25.08.2018 21:34:10', 'dd.mm.yyyy hh24:mi:ss');

要获取当前日期和时间,可以使用current_timestamp(标准SQL)或now()(特定于Postgres)。


不相关,但是:您不应该为user_id列提供值,因为该列是自动生成的,并且通过手动指定值,会使基础序列与插入的值不同步

因此您应该使用:

INSERT INTO account 
  (username, password, email, created_on )
VALUES 
  ('usernamehere', 'password123', 'admin@yahoo.com', current_timestamp);

或者,您可以指定user_id列,但改用default关键字:

INSERT INTO account 
  (user_id, username, password, email, created_on )
VALUES 
  (DEFAULT, 'usernamehere', 'password123', 'admin@yahoo.com', current_timestamp);

或者如果您想要created_on的特定值:

INSERT INTO account 
  (username, password, email, created_on )
VALUES 
  ('usernamehere', 'password123', 'admin@yahoo.com', timestamp '2018-10-15 18:49:10');

答案 1 :(得分:1)

您可以使用函数now(),如下所示:

INSERT INTO account VALUES (
1, 'usernamehere', 'password123', 'admin@yahoo.com', now(), now());

如果last_login应该保留NULL,请使用以下查询:

INSERT INTO account VALUES (
1, 'usernamehere', 'password123', 'admin@yahoo.com', now(), null);

答案 2 :(得分:1)

我建议您先阅读官方的docs on date/time data-types

PostgreSQL通常接受带有时区或时间戳的几种时间戳输入格式-输出格式取决于DateStyle参数。

您可以使用Javascript的Date.now()函数,将结果除以1000,然后将其提供给PostgreSQL的to_timestamp(double precision)函数。

这将始终为您提供正确的值。

在您的情况下:

INSERT INTO account (username, password, email, created_on, last_login) VALUES 
('usernamehere', 'password123', 'admin@yahoo.com', now(), NULL);

注意:插入新行时,您无需提供ID-ID为serial类型,并会自动为您自动生成。

答案 3 :(得分:0)

INSERT INTO account VALUES (
1, 'usernamehere', 'password123', 'admin@yahoo.com', now());

最后一个可以是null,如果您想保存,则也可以将其传递为now()