MYSQL insert particular day of every month - mysql

I have a table
id | due_at | status
1 | 15 April 2021 | successful
1 | 14 May 2021 | successful
1 | 13 June 2021 | successful
How can i change the due_at column to be a fixed day for every month; Such that
id | due_at | status
1 | 15 April 2021 | successful
1 | 15 May 2021 | successful
1 | 15 June 2021 | successful
I have tried this concept
update tablename set due_at = now() + interval 1 month

UPDATE table
SET due_at = CONCAT('15', SUBSTRING(due_at FROM 3));

Related

How to write an SQL query to calculate the average for three consecutive values?

I have a table like this
userID time NoOfVisits
1 2014 50
2 2015 60
3 2016 70
4 2017 80
5 2018 90
6 2019 100
I need to write a sql query which will print time and average of past 3 years NoOfVisits for a particular site.
output should be as
userID time NoOfVisits
1 2014 50.0000
2 2015 55.0000
3 2016 60.0000
4 2017 70.0000
5 2018 80.0000
6 2019 90.0000
Explanation :
For user Id 6 (80+90+100)/3=90.0000
Please help me to solve this problem.
You can use a cumulative average, available in MySQL 8+:
select t.*,
avg(visits) over (order by time rows between 2 preceding and current row) as avg_visits_3
from t;
Assuming there are no gaps between the years (like your sample data), you can self join the table and group by userid, time to get the average:
select
t.userid, t.time, avg(tt.noofvisits) NoOfVisits
from tablename t inner join tablename tt
on tt.time between t.time - 2 and t.time
group by t.userid, t.time
See the demo.
Results:
| userid | time | NoOfVisits |
| ------ | ---- | ---------- |
| 1 | 2014 | 50 |
| 2 | 2015 | 55 |
| 3 | 2016 | 60 |
| 4 | 2017 | 70 |
| 5 | 2018 | 80 |
| 6 | 2019 | 90 |

mysql getting average of client per day in a month

SELECT COUNT(client_ID) / DAY(LAST_DAY(dateRequested))
FROM `tbl_client`
WHERE dateRequested BETWEEN DATE_FORMAT(dateRequested,'%Y-%m-01') AND LAST_DAY(dateRequested)
I want to show the average of client per day in the month
client_ID | dateRequested
1 | 2018-07-04
2 | 2018-07-05
3 | 2018-07-06
4 | 2018-07-07
5 | 2018-08-04
6 | 2018-08-06
7 | 2018-08-09
i want to show
Average | Month
4 | July 2018
3 | August 2018
Try below query:
SELECT COUNT(client_ID),concat(month(dateRequested),year(dateRequested))
FROM `tbl_client`
WHERE dateRequested BETWEEN DATE_FORMAT(dateRequested,'%Y-%m-01') AND LAST_DAY(dateRequested)
group by concat(month(dateRequested),year(dateRequested))

Building SQL query between two number set

Hi i have a table regd like this
name | year | month
james| 2017 | 2
stacy| 2017 | 4
josh | 2017 | 8
june | 2017 | 9
mary | 2018 | 1
hawk | 2018 | 2
sim | 2018 | 3
How can I select all the people between month 8 of year 2017 to month 3 of year 2018.
Thank you for your help and suggestions.
You can write condition like below
year * 100 + month between 201708 and 201803
where 201708 = 2017 * 100 + 8
and 201803 = 2018 * 100 + 3

MySQL Complex Check with dates

I have a table called Offers in which I have several offers:
ID | List Name | Arrival | Depart | Price
1 | Plus | 12 August | 18 August | $ 100.00
2 | Plus | 19 August | 25 August | $ 120.00
3 | Plus | 26 August | 1 September | $ 80.00
4 | Weekend | 11 August | 13 August | $ 50.00
5 | Weekend | 18 August | 20 August | $ 60.00
6 | Weekend | 25 August | 27 August | $ 40.00
Then I have a guest in my hotel which has a check-in and check-out date.
In need to find all the offers with the same List Name that cover all the days of my vacation's guest (from check-in date to check-out date).
Example
If my guest spends his time in my hotel from the 13th of August to the 20th of August I need to be returned only ids 1 and 2.
If my guest spends his time in my hotel from the 13th of August to the 27th of August I need to be returned only ids 1, 2, and 3. That's because the ids 6 and 7 cover only weekend and not all the days between check-in and check-out dates.
If my guest spends his time in my hotel from the 18th of August to the 20th of August I need to be returned only ids 1, 2 and 5.
You are looking for logic like this:
select o.*
from offers o
where o.arrival <= $arrival and o.depart >= $depart;
$arrival and $depart are the dates for your guest.
You need to do something like this :
SQL Fiddle
MySQL 5.6 Schema Setup:
CREATE TABLE offers
(`ID` int, `Arrival` date, `Depart` date, `Price` float)
;
INSERT INTO offers
(`ID`, `Arrival`, `Depart`, `Price`)
VALUES
(1, '2016-08-12', '2016-08-18', 100.00),
(2, '2016-08-19', '2016-08-25', 120.00),
(3, '2016-08-26', '2016-09-01', 80.00),
(4, '2016-08-11', '2016-08-13', 50.00),
(5, '2016-08-18', '2016-08-20', 60.00),
(6, '2016-08-25', '2016-08-27', 40.00)
;
Query 1:
select *
from offers
where (((arrival >= '2016-08-13' and arrival <= '2016-08-20') or
(depart >= '2016-08-13' and depart <= '2016-08-20'))
and datediff(depart,arrival) = 6)
or
(arrival = '2016-08-13' and depart = '2016-08-20'
and datediff(depart,arrival) = 2)
Results:
| ID | Arrival | Depart | Price |
|----|--------------------------|--------------------------|-------|
| 1 | August, 12 2016 00:00:00 | August, 18 2016 00:00:00 | 100 |
| 2 | August, 19 2016 00:00:00 | August, 25 2016 00:00:00 | 120 |
Query 2:
select *
from offers
where (((arrival >= '2016-08-13' and arrival <= '2016-08-27') or
(depart >= '2016-08-13' and depart <= '2016-08-27'))
and datediff(depart,arrival) = 6)
or
(arrival = '2016-08-13' and depart = '2016-08-27'
and datediff(depart,arrival) = 2)
Results:
| ID | Arrival | Depart | Price |
|----|--------------------------|-----------------------------|-------|
| 1 | August, 12 2016 00:00:00 | August, 18 2016 00:00:00 | 100 |
| 2 | August, 19 2016 00:00:00 | August, 25 2016 00:00:00 | 120 |
| 3 | August, 26 2016 00:00:00 | September, 01 2016 00:00:00 | 80 |
Query 3:
select *
from offers
where (((arrival >= '2016-08-18' and arrival <= '2016-08-20') or
(depart >= '2016-08-18' and depart <= '2016-08-20'))
and datediff(depart,arrival) = 6)
or
(arrival = '2016-08-18' and depart = '2016-08-20'
and datediff(depart,arrival) = 2)
Results:
| ID | Arrival | Depart | Price |
|----|--------------------------|--------------------------|-------|
| 1 | August, 12 2016 00:00:00 | August, 18 2016 00:00:00 | 100 |
| 2 | August, 19 2016 00:00:00 | August, 25 2016 00:00:00 | 120 |
| 5 | August, 18 2016 00:00:00 | August, 20 2016 00:00:00 | 60 |

MySQL `SUM` with `GROUP BY` is missing data in results

I have a database with a table containing information on some images, each row containing a createdAt date and a viewCount. The data ranges from September 2014 until today (July 2016). I want to get a monthly sum of the amount of views across all images for the month
When I run the query
SELECT YEAR(createdAt), MONTH(createdAt), SUM(viewCount)
FROM Images
GROUP BY MONTH(createdAt);
I'm only returned 12 rows with results between September 2014 and August 2015
Year | Month | Views
-------------------
2014 | 9 | 1452
2014 | 10 | 279
2014 | 11 | 34428
2014 | 12 | 4763
2015 | 1 | 2826
2015 | 2 | 777
2015 | 3 | 568
2015 | 4 | 1309
2015 | 5 | 46744
2015 | 6 | 1541
2015 | 7 | 8160
2015 | 8 | 91
If I add a date restraint it will give me the latest data, but again only 12 rows
SELECT YEAR(createdAt), MONTH(createdAt), SUM(viewCount)
FROM Images WHERE createdAt > DATE('2015-08-01 00:00:00')
GROUP BY MONTH(createdAt);
Year | Month | Views
--------------------
2015 | 8 | 981
2015 | 9 | 1031
2015 | 10 | 2566
2015 | 11 | 3325
2015 | 12 | 411
2016 | 1 | 2140
2016 | 2 | 710
2016 | 3 | 714
2016 | 4 | 1985
2016 | 5 | 426
2016 | 6 | 119
2016 | 7 | 81
I do realise that since it's July the second query stops there as that's where the data ends, but why does the first query not return all the results?
Group by year/month:
SELECT YEAR(createdAt), MONTH(createdAt), SUM(viewCount)
FROM Images
--WHERE createdAt > DATE('2015-08-01 00:00:00')
GROUP BY YEAR(createdAt), MONTH(createdAt);
Related Group by clause in mySQL and postgreSQL, why the error in postgreSQL?
Keep in mind that from MySQL 5.7.6+ your initial query may not even work because of only_full_group_by which is set by default.
You can simply add Year to you group by
SELECT YEAR(createdAt), MONTH(createdAt), SUM(viewCount)
FROM Images
GROUP BY YEAR(createdAt), MONTH(createdAt)
ORDER BY YEAR(createdAt), MONTH(createdAt)