Sql JDBC和;安慰
我在plpgsql中有一个函数,当我在同一个数据库的同一个表上使用同一个用户运行它时,我会在JDBC调用和psql或psycopg2之间得到不同的结果Sql JDBC和;安慰,sql,postgresql,function,Sql,Postgresql,Function,我在plpgsql中有一个函数,当我在同一个数据库的同一个表上使用同一个用户运行它时,我会在JDBC调用和psql或psycopg2之间得到不同的结果 SELECT id,name, date_deadline, g2j(date_deadline) AS converted_date FROM project_task WHERE NOT date_deadline ISNULL ; 产生psycopg2和psql: id |名称|日期|截止日期|转换日期|
SELECT id,name,
date_deadline,
g2j(date_deadline) AS converted_date
FROM project_task
WHERE NOT date_deadline ISNULL ;
产生psycopg2和psql:
id |名称|日期|截止日期|转换日期|
----+----------------------------------+---------------+----------------
21 |文件管理| 2019-10-29 | 1398-08-06
26 |创建新组件| 2019-09-21 | 1398-06-29
11 |您可以设置任务的截止日期| 2019-11-13 | 1398-08-21
23 |用户界面改进| 2020-04-08 | 1399-01-19
24 |规划和预算| 2019-10-19 | 1398-07-26
17 | 1室:装修| 2019-10-14 | 1398-07-21
16 |经理用黑色椅子| 2019-10-19 | 1398-07-26
15 |降噪| 2019-10-24 | 1398-08-01
31 |单元测试| 2019-02-16 | 1397-11-26
(9排)
pyCharm postgres控制台中JDBC的结果:
21文件管理2019-10-29 1398-08-07
26创建新组件2019-09-21 1398-06-30
11您可以设置任务的截止日期2019-11-13 1398-08-22
23用户界面改进2020-04-08 1399-01-20
24规划和预算2019-10-19 1398-07-27
17房间1:装修2019-10-14 1398-07-22
16张经理用黑色椅子2019-10-19 1398-07-27
15降噪2019-10-24 1398-08-02
31单元测试2019-02-16 1397-11-27
第二个结果(JDBC)是正确的
Column | Type | Collation | Nullable | Default
----------------------------+-----------------------------+-----------+----------+------------------------------------------
id | integer | | not null | nextval('project_task_id_seq'::regclass)
name | character varying | | not null |
date_deadline | date | | |
为什么我会得到这个&-|
我正在Ubuntu上使用PostgreSQL 10.9
psql
版本也是10.9
作用
--功能:g2j(带时区的时间戳)
--丢弃功能g2j(带时区的时间戳)
创建或替换函数g2j(带时区的in_日期时间戳)
返回变量为的字符
$BODY$
声明
y-smallint;
aday smallint;
阿蒙斯莫林;
ayear smallint;
值smallint;
a1半焦(4);
b1焦(2);
c1半焦(2);
Tday smallint;
t月smallint;
Tyear smallint;
温度传感器;
卡比塞耶斯莫林;
TMonthEnd smallint;
国际数日;
无时区的now_day时间戳;
没有时区的时间戳;
无时区的Const_日期时间戳;
开始
将datestyle设置为MDY;
Const_Date=cast('1921年3月21日'as timestamp,无时区);
--如果(长度(铸造日期为文本))<14,则
--输入日期=输入日期+时间'01:30';
--归还日期;
--如果结束;
numdays=日期部分(“天”,在日期中-施工日期);
每天=1;
amonth=1;
一年=1300;
CabisehYear=铸造((numdays/1461)为整数);
numdays=numdays-CabisehYear*1461;
Tyear=按整数计算的转换((numdays/365);
如果Tyear=4,则
Tyear=Tyear-1;
如果结束;
numdays=numdays-Tyear*365;
Tmonth=演员阵容((numdays/31)为整数);
如果(t个月>6个月),则
t月=6;
如果结束;
numdays=numdays-Tmonth*31;
TMonthEnd=0;
如果(numdays>=30,Tmonth=6),则
TMonthEnd=cast((numdays/30)作为整数);
如果TMonthEnd>=5,则
TMonthEnd=5;
如果结束;
numdays=numdays-TMonthEnd*30;
如果结束;
Tmonth=(TMonthEnd+Tmonth);
Tday=numdays;
Tyear=(Tyear+CabisehYear*4);
ayear=(ayear+Tyear);
月数=月数+月数;
日=日+日;
a1=一年;
b1=数量;
c1=每天;
如果长度(b1)=1,则
b1=‘0’| | b1;
如果结束;
如果长度(c1)=1,则
c1=‘0’| | c1;
如果结束;
返回a1 | |'-'| | b1 | |'-'| | c1;
结束;
$BODY$
语言plpgsql VOLATILE
成本100;
由于函数的输入参数是带有时区的时间戳,因此转换没有时区信息的值(如日期
字段)需要添加本地时区。根据:
时区配置参数可以在文件中设置
postgresql.conf
,或中描述的任何其他标准方式
第十九章。还有一些特殊的设置方法:
- SQL命令
设置会话的时区。这是SET timezone
的另一种拼写方式,具有更兼容SQL规范的语法将时区设置为
- libpq客户端使用
环境变量在连接时向服务器发送PGTZ
命令SET timezone
由于此函数中的计算显然是为了处理日期,完全不依赖于时区,因此应将其更改为采用
日期
或无时区的时间戳
参数。日期的类型是什么?如果是时间戳[无时区]
或字符类型,则转换为带时区时间戳将涉及添加本地时区,该时区可由客户端提供(通过设置时区
)或从服务器配置获取。如果有差异,转换将有不同的结果,后续的计算也会有不同的结果。它是日期类型,我没有应用设置时区,代码在同一台服务器上运行。我的第一个猜测也是时区,但它是一个日期字段。您的数据库驱动程序代码可能会隐式地这样做,这将解释您从JDBC访问与其他访问中获得的差异。服务器自己的时区不是唯一的东西。根据,“SQL命令SET TIME ZONE设置会话的时区。这是SET TIME ZONE TO的另一种拼写,具有更符合SQL规范的语法。libpq客户端使用PGTZ环境变量在连接时向服务器发送SET TIME ZONE命令。”由于date
字段也没有时区信息(即日期),因此在传递时,当隐式转换为带有时区的时间戳时,它们也必然会添加时区信息