PyQt4のPostgreSQL QSqlQuery BC情報の損失PyQt4 PostgreSQLのQSqlQuery BC情報の損失
私はPyQt4とPostgreSQLでプログラミングしています、と私は 読ん日付キリスト(BC)の前に問題を抱えています。
# SELECT id, born, givname FROM person WHERE id=100000;
id | born | givname
--------+---------------+---------
100000 | 0428-01-01 BC | Plato
(1 row)
しかし、それは今年の兆候、すなわち、BC/AD情報、 はPyQtはQSqlQueryクラスへのPostgreSQLサーバ から途中でどこかに失われたと思わ:psqlで、すべてがOKです。
この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情報が失われ、どのように私はそれを得ることができますか?ポスターの質問に
回答:
datebaseに格納されている実際のユリウス日の整数値とは何ですか? PostgreSQLの
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
:(www.postgresql.org/docs/9.0/static/functions-formatting.html) ユリウス日 PostgreSQLはSELECT EXTRACTのために0を返します(11月24日深夜、4714 BCからの日数) (ジュリアンから '4714-11-24 BC' :: DATE);
Qtのユリウス日の定義が異なります。 からpyqt.sourceforge.net/Docs/PyQt4/qdate.html#fromJulianDay: "有効な日付の範囲は、1月2日、BCE、4713年1月2日からです。" (たぶんそれはprolepticユリウス暦と 先発グレゴリオ暦の違いはekhumoroによってポストのように、です。)
注1月1日は、4713 BCEが有効と考えるべきではないようだということ:
>>> 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年の間に追加されます。 ところで、読むのはhttps://en.wikipedia.org/wiki/ISO_8601#Years BC表記はISOではないようですが、年号があります。 これは次の質問につながります。 は '0428-01-01 BC'ではなく '-0428-01-01'となるようにサーバーを構成できますか?
日付ベースに格納されている実際のユリウス暦の整数値はどのくらいですか?これは1565097でなければなりません。これはQtが自動的に 'QDate'に変換する唯一の[データ型](https://doc.qt.io/qt-4.8/sql-types.html#postgresql-data-types)です。変換を行うために 'QDate.fromJulianDay()'を使用しなければならないので(なぜなら、期待通りの負の年で 'QDate'を生成するので)、なぜ間違っているのか分かりにくいです。 – ekhumoro
@ekhumoro 'select extract(julianは '0428-01-01 BC' :: date)'返す '1565102' –
**実際の値**はデータベースに保存されていますか?文字列か整数かQtが "BC/AD"の部分を解析できないので、データベースが文字列として日付を格納すると、それは問題を説明することができます。 'QDate.fromJulianDay(1565102)'は 'QDate(-428、1、6)'を返します。これはあなたの質問にある出力とは異なります。 Qtは、1582年10月4日より前の日付には、prolepticユリウス暦を使用しています。一方、PostgreSQLは、プロレプティックなグレゴリオ暦を使用しています。 – ekhumoro