powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Замена велосипеда
5 сообщений из 5, страница 1 из 1
Замена велосипеда
    #39166076
Azur Tihrek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Когда-то давно (1.0? 1.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.
ALTER PROCEDURE GETDATEFROMMNEMONIC (
    MNEMONIC VARCHAR(16) = null)
RETURNS (
    STARTTIME TIMESTAMP)
AS
begin
 if (mnemonic is null) then
    mnemonic = 'hour';
 if (mnemonic = 'today') then
    SELECT current_date from rdb$database INTO :STARTTIME;

  if (mnemonic = 'hour') then
    SELECT dateadd(hour, -1, current_timestamp) from rdb$database INTO :STARTTIME;
  if (mnemonic = '3hour') then
    SELECT dateadd(hour, -3, current_timestamp) from rdb$database INTO :STARTTIME;
  if (mnemonic = 'dbn') then
    SELECT dateadd(day, -1, current_timestamp) from rdb$database INTO :STARTTIME;
  if (mnemonic = '3day') then
    SELECT dateadd(day, -3, current_timestamp) from rdb$database INTO :STARTTIME;
  if (mnemonic = 'week') then
  begin
     if (EXTRACT(weekday from current_date) = 0) then
        SELECT dateadd(day, -6, current_date) from rdb$database INTO :STARTTIME;
     else
        SELECT dateadd(day, -(EXTRACT(weekday from current_date)-1), current_date) from rdb$database INTO :STARTTIME;
  end
  if (mnemonic = 'wtn') then
    SELECT dateadd(week, -1, current_timestamp) from rdb$database INTO :STARTTIME;
  if (mnemonic = 'mtn') then
    SELECT dateadd(month, -1, current_timestamp) from rdb$database INTO :STARTTIME;
  if (mnemonic = 'month') then
    SELECT dateadd(day, -(EXTRACT(DAY from current_date)-1), current_date) from rdb$database INTO :STARTTIME;

  if (mnemonic = 'ytn') then
    SELECT dateadd(year, -1, current_timestamp) from rdb$database INTO :STARTTIME;
  if (mnemonic = 'year') then
    SELECT dateadd(day, -(EXTRACT(YEARDAY from current_date)), current_date) from rdb$database INTO :STARTTIME;
  if (mnemonic similar to '[0-9]+') then
       select dateadd(second, 1+CAST(:mnemonic as bigint)/1000 , timestamp '1970-01-01 02:00:00') from rdb$database INTO :STARTTIME;
  suspend;
end



Можно ли заменить чем-то более изящным?
...
Рейтинг: 0 / 0
Замена велосипеда
    #39166079
Azur Tihrek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ошибся форумом

Модератор: Тема перенесена из форума "Microsoft SQL Server".
...
Рейтинг: 0 / 0
Замена велосипеда
    #39166111
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Azur Tihrek,

similar to не было в 1.0 и 1.5
...
Рейтинг: 0 / 0
Замена велосипеда
    #39166121
Шавлюк Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Azur Tihrek,
отказаться от
Код: sql
1.
SELECT ... from rdb$database INTO :STARTTIME;


Получится так
Код: 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.
create or alter procedure GETDATEFROMMNEMONIC (
    MNEMONIC varchar(16) = null)
returns (
    STARTTIME timestamp)
AS
begin
  if (mnemonic is null) then
    mnemonic = 'hour';
  if (mnemonic = 'today') then
    STARTTIME = current_date;
  if (mnemonic = 'hour') then
    STARTTIME = dateadd(hour, -1, current_timestamp);
  if (mnemonic = '3hour') then
    STARTTIME = dateadd(hour, -3, current_timestamp);
  if (mnemonic = 'dbn') then
    STARTTIME = dateadd(day, -1, current_timestamp);
  if (mnemonic = '3day') then
    STARTTIME = dateadd(day, -3, current_timestamp);
  if (mnemonic = 'week') then
    STARTTIME = dateadd(day, -coalesce(nullif(EXTRACT(weekday from current_date)-1, -1),6), current_date);
  if (mnemonic = 'wtn') then
    STARTTIME = dateadd(week, -1, current_timestamp);
  if (mnemonic = 'mtn') then
    STARTTIME = dateadd(month, -1, current_timestamp);
  if (mnemonic = 'month') then
    STARTTIME = dateadd(day, -(EXTRACT(DAY from current_date)-1), current_date);
  if (mnemonic = 'ytn') then
    STARTTIME = dateadd(year, -1, current_timestamp);
  if (mnemonic = 'year') then
    STARTTIME = dateadd(day, -(EXTRACT(YEARDAY from current_date)), current_date);
  if (mnemonic similar to '[0-9]+') then
    STARTTIME = dateadd(second, 1+CAST(:mnemonic as bigint)/1000 , timestamp '1970-01-01 02:00:00');
  suspend;
end
...
Рейтинг: 0 / 0
Замена велосипеда
    #39166124
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Azur TihrekМожно ли заменить чем-то более изящным?
Легко: для начала убери SELECT FOM rdb$database и используй простые присваивания. Потом RTFM CASE и оставь всего одно присваивание.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Замена велосипеда
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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