Laatste 10 wijzigingen in tabel

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: 1 2 volgende »

Geert Geerts

Geert Geerts

10/08/2019 09:21:53
Quote Anchor link
Ik zou uit een tabel de laatste 6 wijzigingen willen zoeken voor een DIY project.

Tabel Home_Inp
Kolom id, time, Inp_6, Inp_7

5035 , 2019-08-10 06:21:04 , 0 , 0
5036 , 2019-08-10 06:22:04 , 1 , 0
5037 , 2019-08-10 06:23:04 , 0 , 0
5038 , 2019-08-10 06:24:04 , 1 , 0
5039 , 2019-08-10 06:25:04 , 0 , 0
5040 , 2019-08-10 06:27:04 , 1 , 0
5041 , 2019-08-10 06:28:04 , 0 , 0
5042 , 2019-08-10 06:29:04 , 1 , 0
5043 , 2019-08-10 06:30:04 , 1 , 0
5044 , 2019-08-10 06:31:04 , 0 , 0
5045 , 2019-08-10 06:32:04 , 0 , 0
5046 , 2019-08-10 06:33:04 , 0 , 0
5047 , 2019-08-10 06:34:04 , 0 , 0
5048 , 2019-08-10 06:35:04 , 1 , 0
5049 , 2019-08-10 06:36:04 , 0 , 0
5050 , 2019-08-10 06:37:04 , 0 , 0
5051 , 2019-08-10 06:38:04 , 0 , 0
5062 , 2019-08-10 06:39:04 , 1 , 0
5053 , 2019-08-10 06:40:04 , 1 , 0
5054 , 2019-08-10 06:41:04 , 0 , 0



Resultaat zou dus iets zoals onderstaande moeten zijn


5035 , 2019-08-10 06:21:04 , 0 , 0
5036 , 2019-08-10 06:22:04 , 1 , 0
5037 , 2019-08-10 06:23:04 , 0 , 0
5038 , 2019-08-10 06:24:04 , 1 , 0
5039 , 2019-08-10 06:25:04 , 0 , 0
5040 , 2019-08-10 06:27:04 , 1 , 0
5041 , 2019-08-10 06:28:04 , 0 , 0
5042 , 2019-08-10 06:29:04 , 1 , 0
5043 , 2019-08-10 06:30:04 , 1 , 0
5044 , 2019-08-10 06:31:04 , 0 , 0
5045 , 2019-08-10 06:32:04 , 0 , 0
5046 , 2019-08-10 06:33:04 , 0 , 0
5047 , 2019-08-10 06:34:04 , 0 , 0
5048 , 2019-08-10 06:35:04 , 1 , 0
5049 , 2019-08-10 06:36:04 , 0 , 0
5050 , 2019-08-10 06:37:04 , 0 , 0
5051 , 2019-08-10 06:38:04 , 0 , 0
5062 , 2019-08-10 06:39:04 , 1 , 0
5053 , 2019-08-10 06:40:04 , 1 , 0
5054 , 2019-08-10 06:41:04 , 0 , 0

Ik had al onderstaande gevonden een aangepast maar het ik krijg het met mijn beperkte kennis niet in orde

select Home.time,Home.Inp_§
from (select Home_Inp.*,lag(Home_Inp.Inp_6) over(partition by name order by id) as prev_Inp_6
from Home_Inp
) l
where prev_Inp_6 <> Home_Inp.Inp_6
 
PHP hulp

PHP hulp

29/03/2024 08:12:06
 
Rob Doemaarwat

Rob Doemaarwat

10/08/2019 11:19:14
Quote Anchor link
Waar komt kolom 'name' vandaan (als je niet wilt partitioneren kun je dat deel ook gewoon weglaten - dus alleen "over (order by id)")?

Is het niet handiger om bij het opslaan al te checken of de situatie niet exact gelijk is aan de vorige waarde (en dus alleen maar wijzigingen op te slaan)?
 
Jan Koehoorn

Jan Koehoorn

10/08/2019 13:26:39
Quote Anchor link
Maak eenvoudig een kolom dlm (date last modified) aan in je tabel, dan kun je met een LIMIT 6 de zes laatst gewijzigde rows opvragen:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
  `dlm` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
?>
 
Rob Doemaarwat

Rob Doemaarwat

10/08/2019 13:42:34
Quote Anchor link
@Jan: Het gaat er om dat ie alleen de records wil zien waarbij Inp_6 gewijzigd is tov de vorige (en dan de laatste 10).
 
Thomas van den Heuvel

Thomas van den Heuvel

10/08/2019 14:58:45
Quote Anchor link
Denk dat het het makkelijkste is om de vorige waarde redundant op te slaan in het huidige record. Wat indexen erop, en dan een WHERE conditie met inp_6 != inp_6_prev ofzo.

EDIT: actually, bereken het als je een nieuw record invoegt en sla dit op als een BOOLean, bijvoorbeeld inp_6_differs(_from_prev) ofzo. Nog makkelijker.
Gewijzigd op 10/08/2019 19:15:09 door Thomas van den Heuvel
 
Geert Geerts

Geert Geerts

12/08/2019 07:28:02
Quote Anchor link
Rob,

Ik heb ondertussen eea aan het bekijken geweest en kan het schrijven richting database wel aan passen zodat alleen de waarde die effectief aangepast wordt weggeschreven wordt

Zal er dan ongeveer als onderstaande komen uit zien

5035 , 2019-08-10 06:21:04 , 0 , 0
5036 , 2019-08-10 06:22:04 , 1 , 0
5037 , 2019-08-10 06:23:04 , 0 , 0
5038 , 2019-08-10 06:24:04 , 1 , 0
5039 , 2019-08-10 06:25:04 , 0 , 0
5040 , 2019-08-10 06:27:04 , 1 , 0
5041 , 2019-08-10 06:28:04 , 0 , 0
5042 , 2019-08-10 06:29:04 , 1 , 0
5043 , 2019-08-10 06:30:04 , , 0
5044 , 2019-08-10 06:31:04 , 0 , 0
5045 , 2019-08-10 06:32:04 , , 0
5046 , 2019-08-10 06:33:04 , , 0
5047 , 2019-08-10 06:34:04 , , 0
5048 , 2019-08-10 06:35:04 , 1 , 0
5049 , 2019-08-10 06:36:04 , 0 , 0
5050 , 2019-08-10 06:37:04 , , 0
5051 , 2019-08-10 06:38:04 , , 0
5062 , 2019-08-10 06:39:04 , 1 , 0
5053 , 2019-08-10 06:40:04 , , 0
5054 , 2019-08-10 06:41:04 , 0 , 0



SELECT Id, time, Inp_6
FROM Home_Inp
WHERE Inp_6 IS NOT NULL
ORDER BY id DESC LIMIT 10

Heb ik alleen nog een probleem met de datum /tijd.
Deze datum en tijd wordt automatisch ingevuld bij het schrijven naar de database. Als ik die dus opvraag staat die niet in de juiste tijdzone. Voor zover nagevraagd bij one.com kan je de tijd van de database niet aan passen naar jou tijdzone.

Is er een mogelijkheid om bij het opvragen deze tijd toch nog aan te passen rekening houdende met mijn tijdzone en eventueel 'zomer / winter' tijd ?
 
Thomas van den Heuvel

Thomas van den Heuvel

12/08/2019 12:33:22
Quote Anchor link
Sla alles gewoon op in UTC, en reken dit in je presentatielaag om naar de gewenste tijdszone?
 
Geert Geerts

Geert Geerts

12/08/2019 15:46:08
Quote Anchor link
Ik gebruik onderstaande voor de weergave.

Is er een standaard oplossing om de tijd in belgische tijd te krijgen?


Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
  </table>
        <h1>Inputs</h1>
    <table border="0" cellspacing="0" cellpadding="4">
      <tr>
            <td>Tijd </td>
            <td>Input_6</td>
     </tr>
<?php

    // Connect to database
    $con=mysqli_connect("host.mysql","_be","pwd","_be");
    // Retrieve all records and display them  
    $result = mysqli_query($con,'SELECT time, Inp_6 FROM Home_Inp WHERE Inp_6 IS NOT NULL ORDER BY time DESC LIMIT 10');
    // Process every record
    
    while($row = mysqli_fetch_array($result))
    {
      
        echo "<tr>";
        echo "<td>" . $row['time'] . "</td>";
        echo "<td>" . $row['Inp_6'] . "</td>";
        
        echo "</tr>";
    }

          
    // Close the connection  
    mysqli_close($con);
?>

  </table>
Gewijzigd op 12/08/2019 16:32:56 door Geert Geerts
 
- Ariën  -
Beheerder

- Ariën -

12/08/2019 15:53:57
Quote Anchor link
Gelukkig hebben we ook code-tags op het forum voor een nette opmaak met regelnummers.

Hier staat hoe je timezones kan gebruiken:
https://stackoverflow.com/questions/15017799/how-to-convert-utc-date-to-local-time-zone-in-mysql-select-query/15018103#15018103
 
Thomas van den Heuvel

Thomas van den Heuvel

12/08/2019 16:26:02
Quote Anchor link
Waarom zou je dit in je query willen regelen? Dit is een weergavekwestie. Het bovenstaande compliceert enkel je queries. Simpelweg omdat iets op SO staat wil dan zeggen dat dat de beste/makkelijkste oplossing is. Plus je zou dan al je queries met datums etc. zo moeten gaan aanpakken? Daar zou ik zelf noooooooooit aan beginnen.

Zoals gezegd: zorg dat je een vast uitgangspunt hebt (UTC) en datums en tijden altijd op die manier staan opgeslagen, dwing dit eventueel af door deze expliciet in te stellen via je connectie, of nog beter, als je hier bij kunt, in de configuratie op de database-server zelf. Vervolgens kun je in PHP wel van UTC naar je tijdszone-van-persoonlijke-voorkeur.
Gewijzigd op 12/08/2019 16:29:27 door Thomas van den Heuvel
 
- Ariën  -
Beheerder

- Ariën -

12/08/2019 16:36:01
Quote Anchor link
Ieder zijn mogelijkheid. Ikzelf heb het overigens diverse keren met tevredenheid toegepast. (Het is niet dat ik dit net opeens zomaar tegenkwam op SO).

Voornamelijk omdat het rekenen in MySQL juist gemakkelijker maakt. Of je dit nou in je queries moet frotten, of in je view, het is even veel werk.
Gewijzigd op 12/08/2019 16:40:32 door - Ariën -
 
Thomas van den Heuvel

Thomas van den Heuvel

12/08/2019 17:32:04
Quote Anchor link
Het lijkt mij makkelijker om dit in PHP dynamisch te maken, in plaats van MySQL. En als je het dan toch ergens hard code dat het in tijdszone X moet zijn, dan kun je dat beter in PHP-code doen dan in SQL-code. Op het moment dat je dan toch tot het inzicht komt om dingen dynamisch(er) aan te pakken dan hoef je in ieder geval niet al je queries met datums/tijden erin na te lopen en/of om te schrijven...
 
Geert Geerts

Geert Geerts

12/08/2019 17:58:35
Quote Anchor link
Voor zover ik het nu zie. . .
Aan de database configuratie kan ik niets wijzigen.

als is SELECT CONVERT_TZ('2019-08-12 13:28:22','GMT','MET'); gebruik in het controle paneel van one.com krijg ik het juiste uur terug.

Alleen is het me niet duidelijk hoe ik dit moet integreren in mijn php pagina.
 
- Ariën  -
Beheerder

- Ariën -

12/08/2019 18:01:49
Quote Anchor link
Dat moet je dan integreren in je SELECT-query, eerste argument is dan het veld van je UTC timestamp.
Gewijzigd op 12/08/2019 18:10:51 door - Ariën -
 
Thomas van den Heuvel

Thomas van den Heuvel

12/08/2019 22:47:21
Quote Anchor link
En als je nu eens PHP *altijd* de autoriteit laat zijn die bepaalt hoe laat het is? Dus in plaats van NOW() en andere MySQL-tijdfuncties gebruik je $_SERVER['REQUEST_TIME'] of iets soorgelijks (met de UTC tijdzone ingesteld uiteraard). Dan kun je alles al UTC de database in schieten.

Vervolgens maak je gebruik van de DateTime class om de conversie van UTC naar de gewenste tijdszone te maken op het moment dat je een datum/tijd wilt weergeven in een specifieke tijdszone. Dan heb je bovenstaande problematiek nooit en leg je op voorhand vast welke tijdszone de database gebruikt zodat je altijd hetzelfde uitgangspunt hebt. Daarnaast kun je dan je queries simpel houden zonder daar al (hard coded) conversies te doen.
Gewijzigd op 12/08/2019 22:58:25 door Thomas van den Heuvel
 
Geert Geerts

Geert Geerts

13/08/2019 16:19:18
Quote Anchor link
Ik vrees dat ik meer hulp nodig heb.

In de kolom time wordt als standaard waarde CURRENT_TIME mee gegeven in de database.
Op deze manier moets de plc de tijd niet bij houden en was de tijd altijd juist.
Deze tijd wordt als utc in de database gestopt.

Alleen als ik ik die er nu uit haal zie ik niet hoe ik dat php gedeelte moet aan passen om daar ineens de juiste tijdzone (europe/brussels) mee te laten geven.



Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
    $con
=mysqli_connect("");
    $result = mysqli_query($con,'SELECT time, Inp_6 FROM Home_Inp WHERE Inp_6 IS NOT NULL ORDER BY time DESC LIMIT 3');
  
    while($row = mysqli_fetch_array($result))
    {
      
        echo "<tr>";
        echo "<td>" . $row['time'] . "</td>";
        echo "<td>" . $row['Inp_6'] . "</td>";
        echo "</tr>";
    }

    mysqli_close($con);
?>
 
- Ariën  -
Beheerder

- Ariën -

13/08/2019 16:45:42
Quote Anchor link
Je moet enkel de query aanpassen. Maar als timezones belangrijk zijn in je applicatie, dan is het beter om dit in de presentatielaag te doen i.p.v. de queries.
 
Geert Geerts

Geert Geerts

13/08/2019 19:59:10
Quote Anchor link
Dat krijg ik dus niet voor mekaar.

Ik heb als test er al eens de datum en tijd extra tussen gezet. Deze komt mooi van utc naar Europe/Brussels.
Maar de tijden uit de tabel time blijven utc zijn.
Ik vermoed dat hij dat gewoon als tekst bekijkt en daarom er de tijdzone correctie niet doet


Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
    date_default_timezone_set('Europe/Brussels');
    echo date("D M d, Y G:i a");    
    $con=mysqli_connect("xxx";
    $result = mysqli_query($con,'SELECT time, Inp_6 FROM Home_Inp WHERE Inp_6 IS NOT NULL ORDER BY time DESC LIMIT 3');
    while($row = mysqli_fetch_array($result))
    {
      
      
         echo "<tr>";
        echo "<td>" . $row['time'] . "</td>";
        echo "<td>" . $row['Inp_6'] . "</td>";
        
        echo "</tr>";
    }

          
    // Close the connection  
    mysqli_close($con);
?>
 
- Ariën  -
Beheerder

- Ariën -

13/08/2019 20:12:55
Quote Anchor link
je moet het dan wel in de query doen, en niet via PHP functies.
of je gebruikt gewoon PHP, wat eigenlijk nog logischer is:

https://www.php.net/manual/en/datetime.settimezone.php
 
- SanThe -

- SanThe -

13/08/2019 21:40:18
Quote Anchor link
En als je
echo "<td>" . $row['time'] . "</td>";

verandert in
echo "<td>" . date("D M d, Y G:i a", $row['time']) . "</td>";
 
Geert Geerts

Geert Geerts

13/08/2019 21:41:20
Quote Anchor link
Het is niet dat ik er niet zelf wil achter zoeken maar ik zie het echt niet hoe ik dit moet gaan doen.
Ik heb een zeer kleine kennis van PHP en database, al wat ik tot nu toe gebruik komt van het internet en is aangepast naar wat ik nodig had. Dat van die tijd krijg ik dus niet zonder meer hulp in orde vrees ik.

Het is niet dat ik geen interesse heb om hier meer van te weten te komen maar dit is niet iets wat ik mijn dagelijks (of profeesioneel) leven gebruik. Mss iets om te leren als ik later van mijn pensioen kan genieten . . . maar dat is nog niet voor direct :-(

Toevoeging op 14/08/2019 09:32:05:


- SanThe - op 13/08/2019 21:40:18:
En als je
echo "<td>" . $row['time'] . "</td>";

verandert in
echo "<td>" . date("D M d, Y G:i a", $row['time']) . "</td>";



Ondertussen ook eens getest.
Waarde 2019-08-14 06:12:08 in kolom time
geeft 1970 01 01 1:33 am in website (blijkbaar neemt die enkel die 2019?)


Nog eens gekeken van hoe die kolom in de database staat.

Naam Type Collatie Attributen Leeg Standaardwaarde Opmerking extra
time timestamp Nee current_Timestamp()
 

Pagina: 1 2 volgende »



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.