Avatar billede hunter1978 Nybegynder
09. december 2002 - 13:07 Der er 8 kommentarer og
1 løsning

Problemer med gennemsnit med datetime uden alle parameter!

Sidder med et problem med i sql, som jeg håber i kan hjælpe mig med.

Jeg prøver på at lave noget gennemsnits beregning på nogle data´er. Men kan kun få ud på den enkelte dag, ikke på en måned eller år!

Datatypen: date                    beskrivelse: Datetime            yyyy:mm:dd hh:mm:ss

Er der en løsning på dette, eller er jeg nød til at dele date op I flere sammen satte nøgler?

mysql> use millsystem;

Database changed

mysql> show tables;

+----------------------+

| Tables_in_millsystem |

+----------------------+

| millinfo            |

| millperformance      |

| statisticsday        |

| statisticsmonth      |

| statisticsyear      |

+----------------------+

5 rows in set (0.11 sec)



mysql> select * from millperformance;

+---------------------+------------+-----------+-------------+

| date                | millNumber | windSpeed | kWattOutput |

+---------------------+------------+-----------+-------------+

| 2002-11-01 00:00:00 |        11 |        5 |          45 |

| 2002-11-02 00:00:00 |        11 |        7 |          12 |

| 2002-11-03 00:00:00 |        11 |        5 |          45 |

| 2002-11-04 00:00:00 |        11 |        5 |          45 |

| 2002-11-05 00:00:00 |        11 |        5 |          45 |

| 2002-11-06 00:00:00 |        11 |        5 |          45 |

| 2002-11-07 00:00:00 |        11 |        5 |          45 |

| 2002-11-08 00:00:00 |        11 |        5 |          45 |

| 2002-11-09 00:00:00 |        11 |        5 |          45 |

+---------------------+------------+-----------+-------------+

9 rows in set (0.04 sec)



mysql> select avg(windSpeed) from MillPerformance where date ='2002-11-02';

+----------------+

| avg(windSpeed) |

+----------------+

|              7 |

+----------------+

1 row in set (0.01 sec)



mysql> select avg(windSpeed) from MillPerformance where date ='2002-11';

+----------------+

| avg(windSpeed) |

+----------------+

|          NULL |

+----------------+

1 row in set (0.00 sec)



mysql>
Avatar billede emmek Nybegynder
09. december 2002 - 13:17 #1
select avg(windSpeed) from MillPerformance where MONTH(date) BETWEEN x AND y AND YEAR(date) BETWEEN q AND z;

For yderligere info se:
http://www.mysql.com/documentation/mysql/bychapter/manual_Reference.html#Date_and_time_functions
Avatar billede hunter1978 Nybegynder
09. december 2002 - 13:25 #2
Ja, men problemet er at jeg bruger datatypen "Datetime"
Som er en kombination af date og time.
Den der således ud: yyyy-mm-dd hh:mm:ss
Mit problem er at hvis jeg vælger avg med kun år som parameter retunere den null.
Avatar billede emmek Nybegynder
09. december 2002 - 14:17 #3
HAr du prøvet det jeg skrev til dig?
mysql> select MONTH('2002-12-22 13:13:13');
+------------------------------+
| MONTH('2002-12-22 13:13:13') |
+------------------------------+
|                          12 |
+------------------------------+
1 row in set (0.02 sec)

mysql> select MONTH('2002-02-12 13:13:13');
+------------------------------+
| MONTH('2002-02-12 13:13:13') |
+------------------------------+
|                            2 |
+------------------------------+
1 row in set (0.00 sec)

Fordi som jeg ser det, lader det til at MONTH og YEAR funktionerne virker fint med datetime formatet også.. Du har forhåbentligt også regnet ud at x og y skal være hhv. start og slutmåneden for dit gennemsnit, og som en lille bonus satte jeg også mulighed for at lave den med forskellige år..
Hvis du kun vil lave snittet for en enkelt måned skal querien se sådan ud:
select avg(windSpeed) from MillPerformance where MONTH(date) = 8;
hvis du vil ahve snittet for august..
Avatar billede hunter1978 Nybegynder
09. december 2002 - 14:31 #4
Emmek takker for det!
Det var lige det jeg have brug for...
Avatar billede hunter1978 Nybegynder
09. december 2002 - 14:52 #5
Hvis nu jeg ønskede at gøre det på en enkelt dag hvordan skal det så se ud?
Avatar billede emmek Nybegynder
09. december 2002 - 14:57 #6
WEEK(date), DAYOFYEAR(date), WEEKDAY(date), DAYOFMONTH(date) osv. er alle gode funktioner.. Men hvis du får brug for flere funktioner syntes jeg du skal kigge inde på det link jeg skrev til dig..
Avatar billede hunter1978 Nybegynder
09. december 2002 - 15:02 #7
Hej!
Ja men syntes ikke lige jeg kan finde det jeg skal bruge:
Lad os sige at jeg har flere forskelige på samme dato som jeg skal have avg. på
2002-11-01 01:00:00
2002-11-01 02:00:00
2002-11-01 03:00:00
2002-11-01 04:00:00
Hvordan skal den så se ud?
select avg(windSpeed) from MillPerformance where.*

Og takker endnu engang fordi du gider at hjælpe! :)
Avatar billede emmek Nybegynder
09. december 2002 - 16:22 #8
JEg ville bruge:
TO_DAYS(date)
Given a date date, returns a daynumber (the number of days since year 0):
mysql> SELECT TO_DAYS(950501);
        -> 728779
mysql> SELECT TO_DAYS('1997-10-07');
        -> 729669


select avg(windSpeed) from MillPerformance where TO_DAYS(date) = TO_DAYS('2002-11-01');
Burde i hvertfald virke..
Avatar billede hunter1978 Nybegynder
09. december 2002 - 16:30 #9
Takker endnu engang :)!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester