PyQt4 PostgreSQL QSqlQuery BC信息丢失
我正在用PyQt4和PostgreSQL编程,我遇到了一个问题
读基督之前的日期(公元前)。使用psql,一切正常:

# SELECT id, born, givname FROM person WHERE id=100000;
   id   |     born      | givname
--------+---------------+---------
 100000 | 0428-01-01 BC | Plato
(1 row)

但这似乎是一年的标志,即BC/AD信息,
在从PostgreSQL服务器过来的路上丢失了
到PyQt QSqlQuery类。
请参阅以下Python代码片段:
from PyQt4.QtSql import QSqlQuery
sql = 'SELECT born FROM person WHERE id=100000'
query = QSqlQuery(sql)
query.next()
v = query.value(0)
print "v:", v
print "type:", type(v)
print "typename:", v.typeName()
d = v.toDate()
print "valid:", d.isValid()
print "d:", d, d.toString()
print 'dd.MM.yyyy:', d.toString('dd.MM.yyyy')
print "year:", d.year() # should be negative
print "toPyDate:", d.toPyDate()
print "toJulianDay:", d.toJulianDay()

输出:
v: <PyQt4.QtCore.QVariant object at 0xb216cd84>
type: <class 'PyQt4.QtCore.QVariant'>
typename: QDate
valid: True
d: PyQt4.QtCore.QDate(428, 1, 1) So. Jan 1 428
dd.MM.yyyy: 01.01.0428
year: 428
toPyDate: 0428-01-01
toJulianDay: 1877385

问题:
不列颠哥伦比亚省的信息丢失在哪里,我怎么才能得到?
海报问题答案:
数据库中存储的实际儒略日整数值是多少?
volker=# SELECT id, born, extract(julian from born), givname FROM person WHERE id=100000;
   id   |     born      | date_part | givname
--------+---------------+-----------+---------
 100000 | 0428-01-01 BC |   1565102 | Plato

在PostgreSQL中:(www.PostgreSQL.org/docs/9.0/static/functions formatting.html)
儒略日(公元前4714年11月24日午夜起)
PostgreSQL为SELECT EXTRACT返回0(JULIAN FROM'4714-11-24 BC'::DATE);
Qt对朱利安日有不同的定义。
来自pyqt.sourceforge.net/Docs/PyQt4/qdate.html#来自Julianday:
“有效日期范围为公元前4713年1月2日,……”。
(也许这就是先入为主的儒略历和
公历先于公历的历法,如埃克霍洛的文章)
请注意,公元前4713年1月1日似乎不被认为是有效的:
>>> j1 = QDate.fromJulianDay(1)
>>> print j1.getDate()
(-4713, 1, 2)
>>> print j1.toString()
Di. Jan 2 -4713
>>> j0 = QDate.fromJulianDay(0)
>>> print j0.toString()

>>> print j0.getDate()
(-4713, 1, 1)

但数据库中存储的实际值是多少?
我不知道服务器内部存储了什么,我只接受
作为传递给psql客户端的引用,
这似乎是一个ISO日期字符串,
格式为YYYY-MM-DD,其中'BC'附加为BC years。
顺便说一下,阅读https://en.wikipedia.org/wiki/ISO_8601#Years
看起来BC符号不是ISO,但年份符号是。
这就引出了下一个问题:我可以配置服务器使其
产生“-0428-01-01”而不是“0428-01-01 BC”?

最佳答案

好吧,与其说是解决问题的办法,不如说是解决问题的办法,
但正如Ekhuro建议的那样,我可以找回日期
作为字符串(分别。PostgreSQL中的文本),如下所示:

SELECT born::TEXT FROM person WHERE id=100000;

给出结果:
0428-01-01 BC

作为字符串,我可以为BC后缀解析它。
使用整数值也是可能的,但是我必须处理proleptic Julian(Qt)和proleptic Gregorian(PostgreSQL)日期之间的差异,这看起来更复杂。

关于python - PyQt4 PostgreSQL QSqlQuery BC信息丢失,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42589814/

10-12 17:27