Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > Python
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.12.2021, 22:09   #1
HDService
Пользователь
 
Регистрация: 03.12.2021
Сообщений: 12
Вопрос Запрос в SQL в лоб и через Python возвращает разные ответы...

#FirstMessage
Здравия желаю, коллеги!

Ситуация ввела меня в основательный ступор... "Один и тот же" запрос к СУБД (PostgreSQL 12.9) из консоли (драйвер ver. 42.2.22, JDBC4.2) и из скрипта Python (v.3.8.6) возвращает разные ответы.

Консольный запрос:
Код:
SELECT max(T1.battles) - min(T1.battles)         as battles,
       max(T1.dameg_dealt) - min(T1.dameg_dealt) as dameg_dealt,
       max(T1.frags) - min(T1.frags)             as frags,
       max(T1.shots) - min(T1.shots)             as shots,
       max(T1.xp) - min(T1.xp)                   as xp,
       mname
       FROM (
                SELECT to_timestamp(tstamp) + interval '3 hours' as tstamp,
                       mname,
                       all_battles + raiting_battles             as battles,
                       all_damage_dealt + raiting_damage_dealt   as dameg_dealt,
                       all_frags + raiting_frags                 as frags,
                       all_shots + raiting_shots                 as shots,
                       all_xp + raiting_xp                       as xp
                FROM datamembers
            ) as T1
       WHERE EXTRACT('month' FROM T1.tstamp) = EXTRACT('month' FROM now()) - 1
       GROUP BY T1.mname
= Возвращает 44 строки, по 6 определенных на "сиюмомент" значений (!)


А вот запрос из Python:

Код:
@ensure_connection
def test(conn):
    with conn.cursor() as c:
        c.execute(f"""SELECT max(T1.battles) - min(T1.battles)         as battles,
       max(T1.dameg_dealt) - min(T1.dameg_dealt) as dameg_dealt,
       max(T1.frags) - min(T1.frags)             as frags,
       max(T1.shots) - min(T1.shots)             as shots,
       max(T1.xp) - min(T1.xp)                   as xp,
       mname
                               FROM (
                                        SELECT to_timestamp(tstamp) + interval '3 hours' as tstamp,
                                               mname,
                                               all_battles + raiting_battles             as battles,
                                               all_damage_dealt + raiting_damage_dealt   as dameg_dealt,
                                               all_frags + raiting_frags                 as frags,
                                               all_shots + raiting_shots                 as shots,
                                               all_xp + raiting_xp                       as xp
                                        FROM datamembers
                                    ) as T1
                               WHERE EXTRACT('month' FROM T1.tstamp) = EXTRACT('month' FROM now()) - 1
                               GROUP BY T1.mname""")
        d = c.fetchall()
    return d
= Возвращает 43 строки и (!) частично различающиеся значениями от консольного ответа...

Раздебаживание результатов не принесло
Однако удалось выяснить, что присутствие конструкции
Код:
WHERE EXTRACT('month' FROM T1.tstamp) = EXTRACT('month' FROM now()) - 1
очевидно влияет на разницу возвращаемых ответов.

Очевидно, что я чего-томногого не понимаю, но уже об клавиатуру стерся и даже не представляю куда сделать следующий шаг... если только на перекур...

Коллеги, куда копать? Спасибо!

Последний раз редактировалось HDService; 03.12.2021 в 22:21. Причина: Проблема с кодировкой
HDService вне форума Ответить с цитированием
Старый 03.12.2021, 23:22   #2
HDService
Пользователь
 
Регистрация: 03.12.2021
Сообщений: 12
Смущение перекурил...

Обнаружено:
запрос в консоли:
Код:
SELECT text(now())
и из Python
Код:
@ensure_connection
def realtime(conn):
    with conn.cursor() as c:
        c.execute("SELECT text(now())")
        d = c.fetchone()
    return d
из одной и той же среды разработки (PyCharm 2021.2.3 (Professional Edition)) (естественно с одной и той же машины) возвращает:
2021-12-03 23:20:16.006133+03
и
2021-12-03 20:20:29.055266+00

соответственно

Тупня...

Вероятно, тему можно считать закрытой
HDService вне форума Ответить с цитированием
Старый 04.12.2021, 21:49   #3
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,304
По умолчанию

2021-12-03 23:20:16.006133+03
и
2021-12-03 20:20:29.055266+00

Правильно ли я понимаю, что в первом случае выдаётся поясное время, а во втором - мировое?
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 07.12.2021, 11:13   #4
HDService
Пользователь
 
Регистрация: 03.12.2021
Сообщений: 12
По умолчанию

ViktorR, Именно так, коллега - в первом случае timestamp with TimeZone
HDService вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск