gpt4 book ai didi

python - PyQt4 PostgreSQL QSqlQuery BC信息丢失

转载 作者:行者123 更新时间:2023-11-29 12:25:19 24 4
gpt4 key购买 nike

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

问题: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(JULIAN FROM '4714-11-24 BC'::DATE) 返回 0;

Qt 对儒略日有不同的定义。来自 pyqt.sourceforge.net/Docs/PyQt4/qdate.html#fromJulianDay:“有效日期范围是从公元前 4713 年 1 月 2 日开始,...”。(也许这就是 proleptic Julian Calendar 和如 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#YearsBC 符号似乎不是 ISO,但年份符号是。这就引出了下一个问题:我可以配置服务器吗?产生“-0428-01-01”而不是“0428-01-01 BC”?

最佳答案

好的,与其说是解决方案,不如说是解决方法,但正如 ekhumoro 所建议的,我可以检索日期作为字符串(在 PostgreSQL 中为 TEXT),就像这样:

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com