PyQt4 PostgreSQL QSqlQuery BC信息丢失

2024-09-30 16:36:32 发布

您现在位置:Python中文网/ 问答频道 /正文

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)

但它似乎是一年的标志,也就是公元前/公元前的信息, 在从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

问题: BC信息在哪里丢失?如何获取?你知道吗

对海报问题的回答:

存储在数据库中的实际儒略日整数值是多少?你知道吗

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日。 (也许这就是朱利安历法和 前公历前公历,如ekhumoro在《邮报》中所说。)

请注意,公元前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”。 顺便说一下,阅读https://en.wikipedia.org/wiki/ISO_8601#Years 似乎BC符号不是ISO,但年份符号是。 这就引出了下一个问题:我可以配置服务器使其 产生'-0428-01-01'而不是'0428-01-01 BC'?你知道吗


Tags: from信息idpostgresqlselectpersonmmprint
1条回答
网友
1楼 · 发布于 2024-09-30 16:36:32

好吧,与其说是解决办法,不如说是变通办法, 但正如ekhumoro所说,我可以找回日期 作为字符串。PostgreSQL中的文本),简单如下:

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

给出结果:

0428-01-01 BC

作为字符串,我可以解析为BC后缀。你知道吗

使用整数值也是可能的,但是接下来我必须处理proleptic Julian(Qt)和proleptic Gregorian(PostgreSQL)日期之间的差异,这似乎更复杂。你知道吗

相关问题 更多 >