[DJANGO] Datum vergelijken

Pagina: 1
Acties:

Onderwerpen

Vraag


Acties:
  • 0 Henk 'm!

  • N0a
  • Registratie: Februari 2021
  • Laatst online: 13-05 13:07
Mijn vraag
Hallo,

Iets wat mij zeer eenvoudig leek om te doen zorgt op dit moment voor wat frustratie. Ik heb een model in Django dat heel eenvoudig is:

code:
1
2
3
4
class Beweging (models.Model):
    datum = models.DateTimeField(auto_now_add=True)
    waarde= MoneyField(max_digits=65, decimal_places=2, default_currency='EUR')
    memo = models.CharField(max_length=500)


Graag had ik eenvoudig alle waardes tot en met 31-03-2023 verkregen. Ik gebruik hiervoor volgende code:

code:
1
Q1 = Beweging.objects.filter(rekening=afdeling.rekening,datum__lte=datetime.date(2023,3,31))


Jammer genoeg krijg ik alle waarde die lager zijn maar niet gelijk zijn aan deze datum. Dit zijn de waarde in de databank:
code:
1
2
3
4
5
6
| 655 | 2023-03-31 00:00:00.000000 | Q1                                                                                                                       | Startbedrag |     400.00 |          81 | EUR             |
| 656 | 2023-06-30 00:00:00.000000 | Q2                                                                                                                       | Startbedrag |     300.00 |          81 | EUR             |
| 657 | 2023-09-30 00:00:00.000000 | Q3                                                                                                                       | Startbedrag |     200.00 |          81 | EUR             |
| 658 | 2023-12-31 00:00:00.000000 | Q4                                                                                                                       | Startbedrag |     100.00 |          81 | EUR             |
| 659 | 2022-12-31 00:00:00.000000 | ouder                                                                                                                    | Startbedrag |     500.00 |          81 | EUR             |
| 660 | 2012-12-31 00:00:00.000000 | ouder                                                                                                                    | Startbedrag |     600.00 |          81 | EUR


De waarde die ik terugkrijg bij de "Q1" query is de volgende, terwijl er een record is met de overeenstemmend datum met memo Q1 die niet tevoorschijn komt:
code:
1
2
In [123]: Q1
Out[123]: <QuerySet [<Beweging: ouder>, <Beweging: ouder>]>



Relevante software en hardware die ik gebruik
Ubuntu 22.04.3
Maria DB 10.6.16
Django 4.2.2.

Wat ik al gevonden of geprobeerd heb
Ik heb geprobeerd in Django zelf meerdere malen de query te herschrijven maar ik vind het maar niet logisch dat wanneer ik een record met datum 2023-03-31 heb staan deze met een lte query niet wil tevoorschijn komen wanneer de datum exact een match is. Ik ben overgestapt naar de Django shell maar daar bleek het nogmaals duidelijk dat de query niet werkt. Ik dacht eerst dat het zou liggen aan het datatype datetime vs date. Maar wanneer ik netjes de conversie doe via date() dan lukt dit ook niet. Ik heb ook geprobeerd om de "__date" filter toe te voegen maar dan krijg ik een lege lijst aan resultaten.

code:
1
Q1 = Beweging.objects.filter(rekening=afdeling.rekening,datum__date__lte=datetime.date(2023,3,31))


Dank alvast voor een tip in de juiste richting!

Beste antwoord (via N0a op 11-02-2024 10:29)


  • Tk55
  • Registratie: April 2009
  • Niet online
Als ik het goed begrijp wil je alle data zien voor 2023-04-01. Maar je mist alles op de laatste dag van de vorige maand (2023-03-31).

Je vergelijkt een datetime en een date. De datetime van een date 2023-03-01 is 2023-03-01 00:00:00. Dus van de andere tijdstippen op die dag krijg je niets te zien. Ik denk dat dit ook zo hoort.

Waarom gebruik je niet de eerste dag van het volgende kwartaal? Dan is het simpelweg <2023-04-01. Heb je ook geen gedoe met uren, seconden en microseconden.

Alternatief is een (juiste) conversie van datetime naar date, maar je noemt al dat je dat doet en het niet werkt. Hoe heb je dit toegepast?

Nog een alternatief is vergelijken met datetime(2023,3,1,23,59,999).

[ Voor 5% gewijzigd door Tk55 op 10-02-2024 23:26 ]

Alle reacties


Acties:
  • Beste antwoord
  • 0 Henk 'm!

  • Tk55
  • Registratie: April 2009
  • Niet online
Als ik het goed begrijp wil je alle data zien voor 2023-04-01. Maar je mist alles op de laatste dag van de vorige maand (2023-03-31).

Je vergelijkt een datetime en een date. De datetime van een date 2023-03-01 is 2023-03-01 00:00:00. Dus van de andere tijdstippen op die dag krijg je niets te zien. Ik denk dat dit ook zo hoort.

Waarom gebruik je niet de eerste dag van het volgende kwartaal? Dan is het simpelweg <2023-04-01. Heb je ook geen gedoe met uren, seconden en microseconden.

Alternatief is een (juiste) conversie van datetime naar date, maar je noemt al dat je dat doet en het niet werkt. Hoe heb je dit toegepast?

Nog een alternatief is vergelijken met datetime(2023,3,1,23,59,999).

[ Voor 5% gewijzigd door Tk55 op 10-02-2024 23:26 ]


Acties:
  • +1 Henk 'm!

  • N0a
  • Registratie: Februari 2021
  • Laatst online: 13-05 13:07
Klopt inderdaad de laatste dag mis ik.
Tk55 schreef op zaterdag 10 februari 2024 @ 23:25:
Alternatief is een (juiste) conversie van datetime naar date, maar je noemt al dat je dat doet en het niet werkt. Hoe heb je dit toegepast?
Via "__date" conversie, ik had dit in de documentatie gelezen.

code:
1
Q1 = Beweging.objects.filter(rekening=afdeling.rekening,datum__date__lte=datetime.date(2023,3,31))


Maar dan krijg ik waarde 0 terug.

Ik ga denk ik jouw advies volgen en een dagje opschuiven of de tijd meegeven zoals aangegeven onderaan jouw bericht. Ik vind het wel vreemd dat de "__date" conversie niet wil werken.

@Tk55 Super bedankt voor jouw hulp!

Acties:
  • +1 Henk 'm!

  • N0a
  • Registratie: Februari 2021
  • Laatst online: 13-05 13:07
Beste,

Ter aanvulling denk ik dat ik de oorzaak heb gevonden van het niet werken van de "__date" conversie. Wanneer ik in de "settings" de optie "USE_TZ" uitschakel werkt het prima...