Pytanie Jak uzyskać miesiąc i rok z pola Data w sqlalchemy?


Rezultatem powinien być obiekt Date

Ponieważ dnia nie można usunąć, należy go ustawić na pierwszy dzień miesiąca.

Pozostawiając tylko miesiąc, rok


10
2017-08-18 15:25


pochodzenie


Chcesz sklep tylko miesiąc i rok, czy tylko chcesz pokazać te dwie wartości? - Martijn Pieters♦
chciałbym sklep (i group_by odkąd biorę datę z różnych tabel) - user1608977
niezbyt jasne, o co prosisz. to jest kod Pythona, więc wystarczy uzyskać dostęp do aktualnej daty i zmodyfikuj go, aby używał pierwszego z bieżącego miesiąca. - Vaibhav Mishra
Znalazłem równoważne rozwiązanie dla SQL Server dla podobnego problemu: stackoverflow.com/questions/1781946/... Może to trochę wyjaśnia pytanie. - user1608977
@VaibhavMishra: oznaczałoby to ręczną modyfikację daty dla każdego wiersza w moim zestawie zapytań. Myślę, że powinno być bardziej eleganckie rozwiązanie przy użyciu sqlalchemy. Muszę też pogrupować miesiąc, rok - user1608977


Odpowiedzi:


Możesz użyć następujących konstrukcji do filtrowania Date kolumna przy użyciu albo year lub month:

.filter(extract('year', Foo.Date) == 2012)
.filter(extract('month', Foo.Date) == 12)

I group_by jest również możliwe:

.group_by(sqlalchemy.func.year(Foo.Date), sqlalchemy.func.month(Foo.Date))

Teraz nie testowałem tego, ale zakładam, że może to być powolne, ponieważ te zapytania powodują pełne skanowanie tabeli, dlatego sugeruję zainwestowanie trochę czasu i nauczenie się, jak używać kolumny kompozytowe.


23
2017-08-19 06:13



Dzięki. Czy func.year czy func.month działają ze wszystkimi bazami danych? Używam PostgreSQL do produkcji i testów pracy na tymczasowej bazie danych SQLite. - user1608977
@ user1608977 Proponuję, aby przenieść swoje testy również do PostgreSQL, zaoszczędzi ci to trochę czasu, gdy przejdziesz do produkcji. WSKAZÓWKA: Postgres jest nieco "bardziej rygorystyczny", więc szybciej odkryjesz problemy. I mówię z własnego doświadczenia :) - plaes
dzięki, użyłem .filter (extract ('year', Foo.Date) również w group_by.Myślę, że func.year nie jest dostępny postgres, nie jestem pewien. - user1608977
@ user1608977 Ouch, wydaje się func.year jest specyficzne dla MySQL: S - plaes
Chcę tylko zauważyć, że uważam, że jest to doskonała odpowiedź po części ze względu na uwagę na końcu i sugestię, aby spojrzeć na złożone kolumny. - erewok


jeśli zadeklarujesz swój schemat w ten sposób,

schema.Column('created', types.TIMESTAMP(), default=now()),

funkcja now () jest zdefiniowana w tym samym module które mogą być takie

def now():
    now_date = datetime.datetime.now()
    return now_date.replace(day=1)

zgodnie z wymaganiami group_by, tutaj jest wspomniana metoda.

możesz zmodyfikować godzinę i inne pole podobnie.


0
2017-08-18 16:08