Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.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 JDBC和;安慰_Sql_Postgresql_Function - Fatal编程技术网

Sql JDBC和;安慰

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 |名称|日期|截止日期|转换日期|

我在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 |名称|日期|截止日期|转换日期|
----+----------------------------------+---------------+----------------
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
字段也没有时区信息(即日期),因此在传递时,当隐式转换为带有时区的
时间戳时,它们也必然会添加时区信息