powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Перевод процедуры с MS SQL сервер на MySQL с необязательным параметром типа DATE
5 сообщений из 5, страница 1 из 1
Перевод процедуры с MS SQL сервер на MySQL с необязательным параметром типа DATE
    #39616524
BOBAHbI4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как говорится сабж.
Есть запрос который должен был стать хранимой процедурой на 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
Перевод процедуры с MS SQL сервер на MySQL с необязательным параметром типа DATE
    #39616611
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
За синтаксисом следить надо... 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
Перевод процедуры с MS SQL сервер на MySQL с необязательным параметром типа DATE
    #39616699
BOBAHbI4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Благодарю, примерно ошибки понял, но в итоге не совсем то что мне надо.
Версия из MS SQL работает так если в параметре нет даты (параметр пуст) то тогда вычисляется текущая дате, а вот если есть то работа идет относительное неё.
exec ReestrGet --отработает относительно текущей даты
exec ReestrGet '01.012010' -- отработает относительно той даты, что передали как параметр.
Я так понял в MySQL такой номер не пройдет, надо обязательно передавать параметр.
Ну и с синтаксисом, да пока у меня беда.
Совсем не понимаю с какой целью разделитель надо подменять, а потом возвращать его в зад (маневры с DELIMITER).
...
Рейтинг: 0 / 0
Перевод процедуры с MS SQL сервер на MySQL с необязательным параметром типа DATE
    #39616703
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Написали же, IFNULL(_Start, CURRENT_DATE()).
Если параметр пуст, то передавать NULL.
...
Рейтинг: 0 / 0
Перевод процедуры с MS SQL сервер на MySQL с необязательным параметром типа DATE
    #39616707
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BOBAHbI4Совсем не понимаю с какой целью разделитель надо подменять, а потом возвращать его в зад (маневры с DELIMITER). В MySQL нет анонимных блоков. А внутри текста процедуры есть текущий разделитель завершающий отдельные предложения. Сервер не может определить, какая инструкция (CREATE PROCEDURE или текущая) завершается этим разделителем. Поэтому необходимо введение временного разделителя. Если бы текст процедуры состоял из одного предложения, можно было бы обойтись без подмены. Например:
Код: sql
1.
2.
CREATE PROCEDURE ReportGet (IN _Start DATE) 
SELECT IFNULL(_Start, CURRENT_DATE());



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


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