Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Замена велосипеда / 5 сообщений из 5, страница 1 из 1
08.02.2016, 22:37
    #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
08.02.2016, 22:38
    #39166079
Azur Tihrek
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена велосипеда
Ошибся форумом

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

similar to не было в 1.0 и 1.5
...
Рейтинг: 0 / 0
09.02.2016, 00:11
    #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
09.02.2016, 00:13
    #39166124
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена велосипеда
Azur TihrekМожно ли заменить чем-то более изящным?
Легко: для начала убери SELECT FOM rdb$database и используй простые присваивания. Потом RTFM CASE и оставь всего одно присваивание.
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Замена велосипеда / 5 сообщений из 5, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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