[MySQL] Hoe vanaf bepaalde dag vorige maand selecten?

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • phenomic
  • Registratie: Oktober 2005
  • Laatst online: 26-06 11:26
All,

Ik heb een veld 'ts' met datetype timestamp.
Dagelijks worden verbruikdata opgeslagen van een 4G router met een datalimiet.
Op de 27ste van iedere maand gaat de teller op 0 zeg maar. (abbo start dag).

Nu wil ik een select statement hebben met alle records uit de tabel, zodat ik een totaaltelling kan maken
hoeveel traffic er al is verbruikt sinds de 27ste.

Probleem is, het KAN nu nog dezelfde maand van 'de reset' zijn (bv als het de 30ste van de maand is). Maar het kan ook al de 15 zijn van de maand na de reset van de 27ste, dan moet ik dus van de vorige maand de 27ste hebben tot <nu> de 15de

Heb al flink zitten pielen en googlen maar kom er niet uit, hier een guru die er zo maar even een select statement kan uitgooien voor mij?? ;-) Alvast bedankt!

Grtz

Acties:
  • +1 Henk 'm!

  • DJMaze
  • Registratie: Juni 2002
  • Niet online
Eigenlijk had je een voorbeeld moeten geven, want je topic start is wel heel erg summier.
Ik geef je dit cadeau, maar pas op! Eigen inzet is belangrijk

SQL:
1
2
3
SET time_zone = '+0:00';

SELECT * FROM table1 WHERE ts >= DATE_SUB(DATE_FORMAT(CURRENT_TIMESTAMP, '%Y-%m-27T00:00:00'), INTERVAL 1 MONTH);


MySQL timestamp = UTC, gebruik anders gewoon datetime.

[ Voor 70% gewijzigd door DJMaze op 16-03-2017 00:53 ]

Maak je niet druk, dat doet de compressor maar


Acties:
  • 0 Henk 'm!

  • phenomic
  • Registratie: Oktober 2005
  • Laatst online: 26-06 11:26
DJMaze schreef op woensdag 15 maart 2017 @ 22:52:
Eigenlijk had je een voorbeeld moeten geven, want je topic start is wel heel erg summier.
Ik geef je dit cadeau, maar pas op! Eigen inzet is belangrijk

SQL:
1
2
3
SET time_zone = '+0:00';

SELECT * FROM table1 WHERE ts >= DATE_SUB(DATE_FORMAT(CURRENT_TIMESTAMP, '%Y-%m-27T00:00:00'), INTERVAL 1 MONTH);


MySQL timestamp = UTC, gebruik anders gewoon datetime.
Reken maar dat er eigen inzet is ;) Was niet dat ik het na een uurtje opgaf zeg maar.
Maar heb net even gekeken, dit lijkt inderdaad te werken. Geeft me ook houvast om verdere varianten te bestuderen, Thanks!!!

Acties:
  • 0 Henk 'm!

  • DJMaze
  • Registratie: Juni 2002
  • Niet online
phenomic schreef op donderdag 16 maart 2017 @ 16:58:
Reken maar dat er eigen inzet is ;) Was niet dat ik het na een uurtje opgaf zeg maar.
Dat zeg ik eigenlijk ook niet. Het zou mooi zijn als je je inzet ook daadwerkelijk in je topic zou zetten (je SQL brouwsels dus).

Mooi dat je er wel wat mee kan nu.

Maak je niet druk, dat doet de compressor maar


Acties:
  • 0 Henk 'm!

  • Rotterdammertje
  • Registratie: Juni 2002
  • Laatst online: 28-03-2023
Werkt deze query ook goed als het nog dezelfde maand als de "reset" is? Stel de teller is gereset op 27-3-2017, en je runt de query op 30-3-2017. Krijg je dan niet alle alle records vanaf 27-2-2017, in plaats van 27-3-2017?

main = putStr (q ++ show q); q = "main = putStr (q ++ show q); q = "


Acties:
  • 0 Henk 'm!

  • DJMaze
  • Registratie: Juni 2002
  • Niet online
Rotterdammertje schreef op maandag 20 maart 2017 @ 10:19:
Stel de teller is gereset op 27-3-2017, en je runt de query op 30-3-2017. Krijg je dan niet alle alle records vanaf 27-2-2017, in plaats van 27-3-2017?
Correct, dat werkt niet in de huidige vorm ;)

Maak je niet druk, dat doet de compressor maar


Acties:
  • 0 Henk 'm!

  • Rotterdammertje
  • Registratie: Juni 2002
  • Laatst online: 28-03-2023
Wat je eigenlijk wil is: geef me alles vanaf de 27e van de maand van (huidige datum - 26 dagen). Dit moet OP wel in een SQL statement kunnen vatten. ;)

main = putStr (q ++ show q); q = "main = putStr (q ++ show q); q = "


Acties:
  • 0 Henk 'm!

  • DJMaze
  • Registratie: Juni 2002
  • Niet online
Rotterdammertje schreef op maandag 20 maart 2017 @ 11:52:
Wat je eigenlijk wil is: geef me alles vanaf de 27e van de maand van (huidige datum - 26 dagen). Dit moet OP wel in een SQL statement kunnen vatten. ;)
Dat klopt ook niet, het is dan eerder
SQL:
1
CASE WHEN 27 <= DAYOFMONTH(CURRENT_TIMESTAMP) THEN .... ELSE ... END

[ Voor 4% gewijzigd door DJMaze op 20-03-2017 13:22 ]

Maak je niet druk, dat doet de compressor maar


Acties:
  • 0 Henk 'm!

  • Rotterdammertje
  • Registratie: Juni 2002
  • Laatst online: 28-03-2023
Ik denk dat mijn algoritme ook wel werkt:
(27-3-2017) - (26 dagen) = 1-3-2017; de 27e van deze maand is dan 27-3-2017
(26-3-2017) - (26 dagen) = 28-2-2017; de 27e van deze maand is dan 27-2-2017
(28-3-2017) - (26 dagen) = 2-3-2017; de 27e van deze maand is dan 27-3-2017
(1-4-2017) - (26 dagen) = ehhh.. ergens in maart 2017; dus weer 27-3-2017

Hoewel een CASE WHEN waarschijnlijk een stuk duidelijk is. :)

[ Voor 9% gewijzigd door Rotterdammertje op 20-03-2017 15:06 ]

main = putStr (q ++ show q); q = "main = putStr (q ++ show q); q = "


Acties:
  • 0 Henk 'm!

  • KabouterSuper
  • Registratie: September 2005
  • Niet online
In oracle zou ik
SQL:
1
trunc(timestamp-26,'MM')=trunc(sysdate-26,'MM')

doen.
Ofwel, trek 26 dagen van de datums af, en neem de eerste van de maand van die datums.
In Mysql zou dit zoiets worden als
SQL:
1
adddate(timestamp,-26) - interval (day(adddate(timestamp,-26))-1) day=adddate(now(),-26) - interval (day(adddate(now(),-26))-1) day

When life gives you lemons, start a battery factory


Acties:
  • 0 Henk 'm!

  • DJMaze
  • Registratie: Juni 2002
  • Niet online
Rotterdammertje schreef op maandag 20 maart 2017 @ 15:04:
Ik denk dat mijn algoritme ook wel werkt:
(27-3-2017) - (26 dagen) = 1-3-2017; de 27e van deze maand is dan 27-3-2017
(26-3-2017) - (26 dagen) = 28-2-2017; de 27e van deze maand is dan 27-2-2017
(28-3-2017) - (26 dagen) = 2-3-2017; de 27e van deze maand is dan 27-3-2017
(1-4-2017) - (26 dagen) = ehhh.. ergens in maart 2017; dus weer 27-3-2017

Hoewel een CASE WHEN waarschijnlijk een stuk duidelijk is. :)
Aaaah zo bedoelde je:
SQL:
1
DATE_FORMAT(DATE_SUB(CURRENT_TIMESTAMP, INTERVAL 26 DAY), '%Y-%m-27T00:00:00');

Maak je niet druk, dat doet de compressor maar


Acties:
  • 0 Henk 'm!

  • phenomic
  • Registratie: Oktober 2005
  • Laatst online: 26-06 11:26
DJMaze schreef op maandag 20 maart 2017 @ 16:50:
[...]

Aaaah zo bedoelde je:
SQL:
1
DATE_FORMAT(DATE_SUB(CURRENT_TIMESTAMP, INTERVAL 26 DAY), '%Y-%m-27T00:00:00');
Ik ga hier in ieder geval eens mee testen, de eerste statement van DJMaze werkte idd wel, maar ben benieuw wat er gebeurd als je tussen de 27ste en einde van de maand zit.

Ben nog aardige beginner in SQL, thanks dat jullie zo meedenken! ;)
Pagina: 1