Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z procedurą
Forum PHP.pl > Forum > Bazy danych > MySQL
natsukiss
Hej,

piszę procedurę, która chce aby dzieliła mi miesiąc na tygodnie w następujący sposób:



  1. CREATE PROCEDURE RAPORTY_CO_TYDZIEN (IN start_date datetime, IN end_date datetime, out WEEKCOUNT int, out magic int)
  2.  
  3. BEGIN
  4.  
  5. SET @start_date = cast('2015-01-01 00:00:00' AS datetime);
  6. SET @end_date = cast('2025-01-01 00:00:00' AS datetime);
  7. SET @WEEKCOUNT int;
  8. SET @magic int;
  9.  
  10. /* DECLARE @startDate datetime='01/01/2015' */
  11. /* DECLARE @endDate datetime='01/01/2025' */
  12. /* DECLARE @WEEKCOUNT int;*/
  13. /* DECLARE @magic int;*/
  14.  
  15.  
  16.  
  17. SELECT @WEEKCOUNT = Date(week,@startDate,@endDate)
  18. SELECT @magic = case when @WEEKCOUNT<8 then @WEEKCOUNT else (month(@endDate)-month(@startDate))+1 end
  19.  
  20.  
  21. WITH test
  22.  
  23. AS
  24.  
  25. SELECT 1 AS weekcount,
  26. CASE WHEN @WEEKCOUNT < 8 THEN DATEADD(dd, -(DATEPART(dw, @startDate))+1, @startDate)
  27. ELSE DATEADD(dd, -(DAY(@startDate)-1), @startDate) END
  28. CASE WHEN @WEEKCOUNT < 8 THEN DATEADD(dd, 7-(DATEPART(dw, @startDate))+1, @startDate)
  29. else DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@startDate)+1,0)) end
  30.  
  31.  
  32. UNION ALL
  33.  
  34. SELECT a.weekcount+1 AS weekcount,
  35. CASE WHEN @WEEKCOUNT < 8 THEN DATEADD(dd, -(DATEPART(dw, @startDate+(7*(a.weekcount+1))))+2, @startDate+(7*(a.weekcount+1)))
  36. ELSE DATEADD(dd, -(DAY(@startDate+(30*(a.weekcount+1)))-1), @startDate+(30*(a.weekcount+1))) END
  37. CASE WHEN @WEEKCOUNT < 8 THEN DATEADD(dd, 7-(DATEPART(dw, @startDate+(7*(a.weekcount+1))))+1, @startDate+(7*(a.weekcount+1)))
  38. else DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@startDate+(30*(a.weekcount+1)))+1,0)) end
  39. FROM CTESplit a WHERE (a.weekcount+1)<=@magic
  40.  
  41.  
  42.  
  43.  
  44. SELECT * FROM test
  45.  
  46. END


dawno nie siedziałem w mysql, sądzę, że robię wszystko ok, ale cały czas mam problem z deklaracją, googlowałem na tematu erroru, który mi wyskakuje:

  1. Zapytanie SQL:
  2.  
  3.  
  4. CREATE PROCEDURE RAPORTY_CO_TYDZIEN (IN start_date datetime, IN end_date datetime, out WEEKCOUNT int, out magic int)
  5.  
  6. BEGIN
  7.  
  8. DECLARE @start_date = cast('2015-01-01 00:00:00' AS datetime)
  9. MySQL zwrócił komunikat: Dokumentacja
  10.  
  11. #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '@start_date = cast('2015-01-01 00:00:00' as datetime)' at line 5


i w tym momencie stanąłem i nie wiem jak rozwiązać ten problem..

Z góry dziękuję za każdą wskazówkę.
Pyton_000
Wywal @ po DECLARE
natsukiss
troszkę inny błąd

Kod
Zapytanie SQL:


CREATE PROCEDURE RAPORTY_CO_TYDZIEN (IN start_date datetime, IN end_date datetime, out WEEKCOUNT int, out magic int)

BEGIN



DECLARE startDate datetime='01/01/2015'
DECLARE endDate datetime='01/01/2025'
DECLARE WEEKCOUNT int
MySQL zwrócił komunikat: Dokumentacja

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '='01/01/2015'
DECLARE endDate datetime='01/01/2025'
DECLARE WEEKCOUNT int' at line 7


edit:

teraz zakomentowałem "sety" a odkomentowałem "declare'y", tak na chłopski rozum. Nadal jednak mam to samo.

Zaczynam się jednak zastanawiać czy traktować to jako "procedurę".

Zależy mi na tym aby nie wpisywać z palca tych dat od początku do końca danego tygodnia w miesiącu.. Może należy się za to zabrać inaczej questionmark.gif
Pyton_000
http://stackoverflow.com/a/11754790/3732803
natsukiss
Próbowałem już chyba wszystkiego jeśli chodzi o deklarację zmiennych... na razie testuję lokalnie więc powinno działać bez małpy, a tak nie jest.
Próbowałem z jedną małpą i też z dwoma, bez skutku.
redeemer
Nie czytałem kodu tej procedury, ale może wystarczy Ci WEEK()? https://dev.mysql.com/doc/refman/5.7/en/dat...-functions.html
viking
A średniki to tam masz?
natsukiss
Hej, próbowałem ze średnikami jak i bez, próbowałem różnorakich metod deklaracji zmiennych, próbowałem też przeróżnie deklarować procedurę w bazie.. wszystko bez skutku. Jeśli ktoś mógłby przetestować tą procedurę to byłbym wdzięczny, ponieważ może to ja mam jakiś błąd w bazie danych.
Pyton_000
Pokaż procedurę po zmianach.
Damonsson
Po pierwsze żadne DECLARE Ci nie są potrzebne. Tym bardziej żadne SETy danych WYJŚCIOWYCH.
Po drugie skąd sobie wziąłeś WITH i AS w MySQL?
Nie mówiąc już o DATEADD czy DATEPART.

Z księżyca spadłeś chyba wink.gif


EDIT: Napisz nam co chcesz konkretnie osiągnąć i ktoś Ci pomoże w napisaniu nowej procedury, o ile okaże się, że jest Ci w ogóle potrzebna. Bo z tej to nic nie będzie.
natsukiss
Cytat(Damonsson @ 8.12.2015, 09:45:11 ) *
Po pierwsze żadne DECLARE Ci nie są potrzebne. Tym bardziej żadne SETy danych WYJŚCIOWYCH.
Po drugie skąd sobie wziąłeś WITH i AS w MySQL?
Nie mówiąc już o DATEADD czy DATEPART.

Z księżyca spadłeś chyba wink.gif


EDIT: Napisz nam co chcesz konkretnie osiągnąć i ktoś Ci pomoże w napisaniu nowej procedury, o ile okaże się, że jest Ci w ogóle potrzebna. Bo z tej to nic nie będzie.



Bardzo dziękuję za uwagi, tak jak mówisz.. moje funkcje nie odnoszą się do MySQL biggrin.gif cytując stackoverflow DATEPART is a Transact-SQL function. Teraz w takim razie jestem totalnie w czarnej du.. =D


CO CHCE OSIĄGNĄĆ:

tak jak pisałem w pierwszym poście, chciałbym aby po podaniu daty początkowej co tydzien tworzył mi się raport, ALE... chciałbym żeby tydzień kończyl się np. 29,30,31 dnia miesiąca (w zależności od miesiąca, np. styczeń -> 31 dni. luty -> 28/29 dni), tak samo z rozpoczynaniem tygodni, że tydzień zaczyna mi się od pierwszego dnia miesiąca. (np. pierwszy jest w środę a tydzień kończy się w niedziele piątego itd.)
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.