Laatste 10 wijzigingen in tabel
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
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: Het gaat er om dat ie alleen de records wil zien waarbij Inp_6 gewijzigd is tov de vorige (en dan de laatste 10).
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
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 ?
Sla alles gewoon op in UTC, en reken dit in je presentatielaag om naar de gewenste tijdszone?
Is er een standaard oplossing om de tijd in belgische tijd te krijgen?
Code (php)
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
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>
<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
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
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
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 -
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...
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.
Gewijzigd op 12/08/2019 18:10:51 door - Ariën -
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
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)
1
2
3
4
5
6
7
8
9
10
11
12
13
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);
?>
$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);
?>
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.
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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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);
?>
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);
?>
of je gebruikt gewoon PHP, wat eigenlijk nog logischer is:
https://www.php.net/manual/en/datetime.settimezone.php
echo "<td>" . $row['time'] . "</td>";
verandert in
echo "<td>" . date("D M d, Y G:i a", $row['time']) . "</td>";
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>";
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()