2017-03-03 6 views
2

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'となるようにサーバーを構成できますか?

+0

日付ベースに格納されている実際のユリウス暦の整数値はどのくらいですか?これは1565097でなければなりません。これはQtが自動的に 'QDate'に変換する唯一の[データ型](https://doc.qt.io/qt-4.8/sql-types.html#postgresql-data-types)です。変換を行うために 'QDate.fromJulianDay()'を使用しなければならないので(なぜなら、期待通りの負の年で 'QDate'を生成するので)、なぜ間違っているのか分かりにくいです。 – ekhumoro

+0

@ekhumoro 'select extract(julianは '0428-01-01 BC' :: date)'返す '1565102' –

+0

**実際の値**はデータベースに保存されていますか?文字列か整数かQtが "BC/AD"の部分を解析できないので、データベースが文字列として日付を格納すると、それは問題を説明することができます。 'QDate.fromJulianDay(1565102)'は 'QDate(-428、1、6)'を返します。これはあなたの質問にある出力とは異なります。 Qtは、1582年10月4日より前の日付には、prolepticユリウス暦を使用しています。一方、PostgreSQLは、プロレプティックなグレゴリオ暦を使用しています。 – ekhumoro

答えて

0

OK、それは、ソリューションよりも多くの問題を回避するだ けどekhumoroが示唆したように、私は単純に、このように、文字列(PostgreSQLのRESP TEXT。)として日付 を取得することができます。

与える
SELECT born::TEXT FROM person WHERE id=100000; 

を結果:

0428-01-01 BC 

BC接尾辞を解析できる文字列です。

整数値を使用することもできますが、私は、より複雑なように、前立腺のジュリアン(Qt)と前立腺グレゴリオ(PostgreSQL)の日付の違いに対処しなければなりません。

関連する問題