我有以下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时间戳列的值?
答案 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()