Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Перевод процедуры с MS SQL сервер на MySQL с необязательным параметром типа DATE / 5 сообщений из 5, страница 1 из 1
18.03.2018, 19:00
    #39616524
BOBAHbI4
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевод процедуры с MS SQL сервер на MySQL с необязательным параметром типа DATE
Как говорится сабж.
Есть запрос который должен был стать хранимой процедурой на MS SQL server. Код опробован и рабочий
Здесь только часть, которая работает с датами, дальше даты участвуют в хитрых запросах.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
DECLARE @CurrentDate DATE = NULL, --Дата на которую делается отчет 
		@FirstDate DATE, --Первое число месяца из @CurrentDate
		@MidDate DATE, --15е число месяца из @CurrentDate
		@DecDate DATE  -- 11е число месяца из @CurrentDate
--Это архиважный параметр, по нему можно делать срез на абсолютно любое число, хотя не поло
SET @CurrentDate= GETDATE() -- сделать входным параметром и допустить что его нет, тогда взять текущую дату
--вычисление промежуточных дат
SET @FirstDate =DATEADD(DAY,1-DAY(@CurrentDate),@CurrentDate) -- Нахождение первого числа месяца относительно @CurrentDate
SET @MidDate =DATEADD(DAY,14, @FirstDate) -- Нахождение 15 го числа месяца относительно @CurrentDate
SET @DecDate=DATEADD(DAY, 10, @FirstDate) -- Нахождени 11го числа месяца относительно @CurrentDate


Но вот перевести это код в процедуру на MySQL Ни как
Код: sql
1.
2.
3.
4.
5.
CREATE PROCEDURE 'ReportGet' (IN _Start DATE DEFAULT NOW())
BEGIN
 /* SET Start IFNULL(Start, CURRENT_DATE()); */
SELECT _Start;
END;


Если убрать DEFAULT То ругается на CURRENT_DATE
Даже не знаю как реализовать необязательный параметр типа DATE, чтобы если он пустой то была текущая дата, без времени.
...
Рейтинг: 0 / 0
19.03.2018, 08:03
    #39616611
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевод процедуры с MS SQL сервер на MySQL с необязательным параметром типа DATE
За синтаксисом следить надо... 6 ляпов на 5 строк!
Код: sql
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.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
mysql> DELIMITER @@;
mysql> CREATE PROCEDURE ReportGet (IN _Start DATE)
    -> BEGIN
    -> SELECT _Start AS _Before;
    -> SET _Start = IFNULL(_Start, CURRENT_DATE());
    -> SELECT _Start AS _After;
    -> END;
    -> @@;
Query OK, 0 rows affected (0.00 sec)

mysql> DELIMITER ;
mysql> CALL ReportGet('2001-02-03');
+------------+
| _Before    |
+------------+
| 2001-02-03 |
+------------+
1 row in set (0.00 sec)

+------------+
| _After     |
+------------+
| 2001-02-03 |
+------------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

mysql> CALL ReportGet(Null);
+---------+
| _Before |
+---------+
| NULL    |
+---------+
1 row in set (0.00 sec)

+------------+
| _After     |
+------------+
| 2018-03-19 |
+------------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

mysql> CALL ReportGet();
ERROR 1318 (42000): Incorrect number of arguments for PROCEDURE test.ReportGet; expected 1, got 0
mysql> DROP PROCEDURE ReportGet;
Query OK, 0 rows affected (0.00 sec)
...
Рейтинг: 0 / 0
19.03.2018, 11:51
    #39616699
BOBAHbI4
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевод процедуры с MS SQL сервер на MySQL с необязательным параметром типа DATE
Благодарю, примерно ошибки понял, но в итоге не совсем то что мне надо.
Версия из MS SQL работает так если в параметре нет даты (параметр пуст) то тогда вычисляется текущая дате, а вот если есть то работа идет относительное неё.
exec ReestrGet --отработает относительно текущей даты
exec ReestrGet '01.012010' -- отработает относительно той даты, что передали как параметр.
Я так понял в MySQL такой номер не пройдет, надо обязательно передавать параметр.
Ну и с синтаксисом, да пока у меня беда.
Совсем не понимаю с какой целью разделитель надо подменять, а потом возвращать его в зад (маневры с DELIMITER).
...
Рейтинг: 0 / 0
19.03.2018, 11:59
    #39616703
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевод процедуры с MS SQL сервер на MySQL с необязательным параметром типа DATE
Написали же, IFNULL(_Start, CURRENT_DATE()).
Если параметр пуст, то передавать NULL.
...
Рейтинг: 0 / 0
19.03.2018, 12:05
    #39616707
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевод процедуры с MS SQL сервер на MySQL с необязательным параметром типа DATE
BOBAHbI4Совсем не понимаю с какой целью разделитель надо подменять, а потом возвращать его в зад (маневры с DELIMITER). В MySQL нет анонимных блоков. А внутри текста процедуры есть текущий разделитель завершающий отдельные предложения. Сервер не может определить, какая инструкция (CREATE PROCEDURE или текущая) завершается этим разделителем. Поэтому необходимо введение временного разделителя. Если бы текст процедуры состоял из одного предложения, можно было бы обойтись без подмены. Например:
Код: sql
1.
2.
CREATE PROCEDURE ReportGet (IN _Start DATE) 
SELECT IFNULL(_Start, CURRENT_DATE());



BOBAHbI4Я так понял в MySQL такой номер не пройдет, надо обязательно передавать параметр.Угу. Все параметры в процедурах/функциях MYSQL - обязательные.
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Перевод процедуры с MS SQL сервер на MySQL с необязательным параметром типа DATE / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]