I have column named start
im my database where i store thousands of dates
(not the ones you can eat) in the following format:
2019-05-04 07:30:00
To get some stats im using google.charts
and trying to group the values by the name of days (Monday, Thuesday).
So far I have the following. Any idea how to extract the day name from the datetime and group them by the same names to get something like:
Monday 120
Thuesday 236
Wednesday 987
and so on
Database Structure:
-- phpMyAdmin SQL Dump
-- version 4.9.7deb1
-- https://www.phpmyadmin.net/
CREATE TABLE `test` (
`id` int(10) UNSIGNED NOT NULL,
`start` datetime NOT NULL,
`end` datetime DEFAULT NULL,
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
Select Statement so far:
$sql_8 = "SELECT `start` count(*) as number FROM test GROUP BY `start` ";
PHP Query and Script part:
<?php
$result_8 = mysqli_query($conn, $sql_8);
?>
<script type="text/javascript">
google.charts.load('current', {'packages':['table']});
google.charts.setOnLoadCallback(drawTable);
function drawTable() {
var data = new google.visualization.DataTable();
data.addColumn('string', 'Day');
data.addColumn('number', 'Count');
data.addRows([
<?php
while($row = mysqli_fetch_array($result_8)) {
$date = $row["start"];
echo "[ ' ".$date." ', ".$row["number"]." ],";
}
?>
]);
var table = new google.visualization.Table(document.getElementById('table_div_8'));
table.draw(data, {showRowNumber: true, width: '100%', height: '100%',});
}
</script>
2
Answers
The MySql / MariaDB function DAYOFWEEK(start) gives you a number 1-7 (1 == Sunday) for any DATE, DATETIME, or TIMESTAMP value. So if you
GROUP BY DAYOFWEEK(start) ORDER BY DAYOFWEEK(start)
you will get a useful result set in a useful order.Something like this query will work.
Pro tip: Every minute you spend studying your RDBMS’s date and time arithmetic operations will save you hours in the future.
If you’re looking to group by day name regardless of in what year or month the date is, then you can use MySQL DAYNAME() function:
And maybe if you want to order by day ascending, then add another function
WEEKDAY()
–Monday
as it’s first day; orDAYOFWEEK()
– Sunday as it’s first day.Demo fiddle