Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在postgres中,您可以按会话或全局设置时间戳的默认格式吗?_Sql_Postgresql_Timestamp - Fatal编程技术网

Sql 在postgres中,您可以按会话或全局设置时间戳的默认格式吗?

Sql 在postgres中,您可以按会话或全局设置时间戳的默认格式吗?,sql,postgresql,timestamp,Sql,Postgresql,Timestamp,在Postgres中,是否可以更改时间戳的默认格式掩码 现在又回来了 2012-01-03 20:27:53.611489 我想以这样的方式发言: 2012-01-03 20:27 select to_char(current_timestamp, 'yyyy-MM-dd HH24:MI:SS.MS'); select to_timestamp('2012-10-11 12:13:14.123', 'yyyy-MM-dd HH24:MI:SS.MS')::timestamp;

在Postgres中,是否可以更改时间戳的默认格式掩码

现在又回来了

2012-01-03 20:27:53.611489
我想以这样的方式发言:

2012-01-03 20:27
select to_char(current_timestamp, 'yyyy-MM-dd HH24:MI:SS.MS');

select to_timestamp('2012-10-11 12:13:14.123', 
     'yyyy-MM-dd HH24:MI:SS.MS')::timestamp;
CREATE TABLE moo (
    key     int PRIMARY KEY,
    boo     text NOT NULL DEFAULT TO_CHAR(CURRENT_TIMESTAMP,'YYYYMM')
);
select current_timestamp at time zone 'UTC'
Result: "2012-10-24 01:40:10.543251"
我知道我可以在单个列上使用
to_char()作为
,或者通过接收应用程序使用
substr()
进行精简,但是如果一开始将其正确格式化,将节省大量工作并减少大量错误。

to_char()
用于创建字符串文字。如果需要不同的时间戳值,请使用:

date_trunc('minute', now())
对于输入掩码,您可以使用:

to_timestamp('2012-01-03 20:27:53.611489', 'YYYY-MM-DD HH24:MI')
通过附加
::timestamp
强制转换为不带时区的
时间戳


据我所知,PostgreSQL中没有默认从时间戳文本中删除秒数的设置。

在postgres中,您可以使用
设置日期样式
选项更改日期时间的默认格式掩码;可以找到可用选项(见8.5.2.日期/时间输出)


不幸的是,所有可用选项都包括秒数,因此您需要在查询或应用程序代码(如果适用)中重新格式化秒数。

在PostgreSQL中,时间戳的格式与存储无关。一个答案是使用
来_char
并将时间戳格式化为您需要的任何格式,如下所示:

2012-01-03 20:27
select to_char(current_timestamp, 'yyyy-MM-dd HH24:MI:SS.MS');

select to_timestamp('2012-10-11 12:13:14.123', 
     'yyyy-MM-dd HH24:MI:SS.MS')::timestamp;
CREATE TABLE moo (
    key     int PRIMARY KEY,
    boo     text NOT NULL DEFAULT TO_CHAR(CURRENT_TIMESTAMP,'YYYYMM')
);
select current_timestamp at time zone 'UTC'
Result: "2012-10-24 01:40:10.543251"
但如果必须设置默认格式:

全局更改postgresql时间戳格式:

查看您的时区,将其作为sql查询运行:

show timezone
Result: "US/Eastern"
因此,当您打印当前的时间戳时,您会看到:

select current_timestamp
Result: 2012-10-23 20:58:35.422282-04
末尾的
-04
是相对于UTC的时区。您可以通过以下方式更改时区:

set timezone = 'US/Pacific'
然后:

select current_timestamp
Result: 2012-10-23 18:00:38.773296-07
请注意这里的
-07
,这意味着我们太平洋航空公司距离UTC有7小时的路程。我怎样才能让那个难看的时区消失?一种方法是创建一个表,它默认为没有时区的时间戳:

CREATE TABLE worse_than_fail_table
(
    mykey          INT unique not null,
    fail_date      TIMESTAMP not null
);
select current_timestamp::timestamp
Result: 2012-10-23 21:18:05.107047
然后,如果向该表添加时间戳并从中选择

select fail_date from worse_than_fail_table
Result: 2012-10-23 21:09:39.335146
耶,终点没有时区。但是您希望更多地控制时间戳在默认情况下的显示方式!你可以这样做:

2012-01-03 20:27
select to_char(current_timestamp, 'yyyy-MM-dd HH24:MI:SS.MS');

select to_timestamp('2012-10-11 12:13:14.123', 
     'yyyy-MM-dd HH24:MI:SS.MS')::timestamp;
CREATE TABLE moo (
    key     int PRIMARY KEY,
    boo     text NOT NULL DEFAULT TO_CHAR(CURRENT_TIMESTAMP,'YYYYMM')
);
select current_timestamp at time zone 'UTC'
Result: "2012-10-24 01:40:10.543251"
这是一个文本字段,当您执行
从sometable
中选择sometcolumns时,它可以让您更好地控制默认情况下它的显示方式。请注意,您可以将字符串强制转换为时间戳:

select '2012-10-11 12:13:14.56789'::timestamp
Result: 2012-10-11 12:13:14.56789
您可以将当前时间戳强制转换为
时间戳
,从而删除时区:

CREATE TABLE worse_than_fail_table
(
    mykey          INT unique not null,
    fail_date      TIMESTAMP not null
);
select current_timestamp::timestamp
Result: 2012-10-23 21:18:05.107047
您可以像这样摆脱时区:

2012-01-03 20:27
select to_char(current_timestamp, 'yyyy-MM-dd HH24:MI:SS.MS');

select to_timestamp('2012-10-11 12:13:14.123', 
     'yyyy-MM-dd HH24:MI:SS.MS')::timestamp;
CREATE TABLE moo (
    key     int PRIMARY KEY,
    boo     text NOT NULL DEFAULT TO_CHAR(CURRENT_TIMESTAMP,'YYYYMM')
);
select current_timestamp at time zone 'UTC'
Result: "2012-10-24 01:40:10.543251"
但如果你真的想回到时区,你可以这样做:

select current_timestamp::timestamp with time zone
Result: 2012-10-23 21:20:21.256478-04
您可以使用extract提取您想要的内容:

SELECT EXTRACT(HOUR FROM TIMESTAMP '2001-02-16 20:38:40');
Result: 20
还有这个怪物:

SELECT TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40-05' AT TIME ZONE 'EST';
Result: 2001-02-16 20:38:40

您使用的是哪个客户端应用程序?php原型,大约6个月后移动到node.js这将是一个需要更改的php设置,而不是Postgres设置。@a_horse_和_no_name您可能是对的。希望可以使用类似于
locale
的设置<代码>区域设置
格式,但格式是固定的。谢谢,但问题不在于时间戳的值,而在于选择时的字符串表示形式。在这个应用程序中,呈现给用户的时间戳总是四舍五入到最接近的分钟-与显示有关,而与数据无关。正在寻找一种方法,在每个select的每一列上都没有
to_char()
。@cYoung:如果您想四舍五入到最近的一分钟,
to_char()
也帮不了您。你只能用它来截断。无论如何,这听起来像是客户机的工作,而不是数据库的工作。理论上我相信你可能是对的,但实际上,你几乎总是把日期格式和算术放在SQL中,因为它比javascript或php好得多。顺便说一句,你对使用
to_char()的round和truncate有深刻的见解
-幸运的是,这是预期的行为,并没有回答问题。