Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Прибавить/убавить timezone к timestamp / 10 сообщений из 10, страница 1 из 1
23.09.2015, 10:43
    #39059176
pastor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прибавить/убавить timezone к timestamp
Шалом.

Таки туплю.

Есть входящий параметр, очень легко делим его на составные части

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
 AXMLDate = '2015-09-19T23:59:59+04:00';

 ADATE = substring( AXMLDate from 1 for 10);
 ATIME = substring( AXMLDate from 12 for 8);

 ATIMESTAMP = ADATE + ATIME;

 ATimezoneSign = coalesce(substring( AXMLDate from 20 for 6), '+03:00');
 ATimezone = substring( ATimezoneSign from 2 for 5);
 ATimezonesign = substring( ATimezoneSign from 1 for 1);



а вот здесь настигает печаль:

Код: sql
1.
2.
3.
 if (ATimezoneSign = '-')
    then ATIMESTAMP = ATIMESTAMP + ATimezone;
    else ATIMESTAMP = ATIMESTAMP - ATimezone;



Пока через левую дату преобразовываю в double, но после перенесенного насморка мозг от такого решения подташнивает.

Код: sql
1.
 ATimezone = cast('01.01.2015' as DATE) + cast(substring( ATimezoneSign from 2 for 5) as TIME) - cast('01.01.2015' as TIMESTAMP);


Господа, нет ли поизящнее?
...
Рейтинг: 0 / 0
23.09.2015, 11:09
    #39059201
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прибавить/убавить timezone к timestamp
ATIMESTAMP = ADATE + ATIME + ATimezone * 3600

зы: без учёта знака
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
23.09.2015, 11:11
    #39059208
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прибавить/убавить timezone к timestamp
пардон, скобки забыл
> ATIMESTAMP = ADATE + (ATIME + ATimezone * 3600)
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
23.09.2015, 11:17
    #39059220
pastor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прибавить/убавить timezone к timestamp
Мимопроходящий,

С отрицательными зонами не прокатит.
...
Рейтинг: 0 / 0
23.09.2015, 11:24
    #39059227
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прибавить/убавить timezone к timestamp
Я-бы таймзону хранил отдельно.
...
Рейтинг: 0 / 0
23.09.2015, 11:27
    #39059231
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прибавить/убавить timezone к timestamp
Hello, Pastor!
You wrote on 23 сентября 2015 г. 11:27:18:

Pastor> С отрицательными зонами не прокатит.почему?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
23.09.2015, 11:41
    #39059253
Шавлюк Евгений
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прибавить/убавить timezone к timestamp
pastor,

А чем dateadd не угодил?
Перевести ATimezone в минуты
dateadd(hour, -180, current_timestamp)
...
Рейтинг: 0 / 0
23.09.2015, 12:05
    #39059284
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прибавить/убавить timezone к timestamp
Hello, Шавлюк Евгений!
You wrote on 23 сентября 2015 г. 12:05:15:

Шавлюк Евгений> Перевести ATimezone в минуты
> dateadd(hour, -180, current_timestamp)вот оно!
+1
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
23.09.2015, 12:11
    #39059289
pastor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прибавить/убавить timezone к timestamp
Шавлюк Евгенийpastor,

А чем dateadd не угодил?
Перевести ATimezone в минуты
dateadd(hour, -180, current_timestamp)

пример перевода таймзоны в часы написал в первом посте.

Ваш пример нуждается в переводе таймзоны в минуты.
...
Рейтинг: 0 / 0
23.09.2015, 21:38
    #39059870
Шавлюк Евгений
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прибавить/убавить timezone к timestamp
pastorВаш пример нуждается в переводе таймзоны в минуты.
Зато никаких проблем с отрицательными зонами

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
create or alter procedure XMLDATE2TIMESTAMP (
    AXMLDATE varchar(25) = '2015-09-19T23:59:59+04:00')
returns (
    ATIMESTAMP timestamp,
    ADATE date,
    ATIME time,
    ATIMEZONEMINUTES integer)
AS
declare variable ATimezoneSign varchar(6);
begin
  ADATE = substring(AXMLDate from 1 for 10);
  ATIME = substring(AXMLDate from 12 for 8);
  ATimezoneSign = coalesce(substring( AXMLDate from 20 for 6), '+03:00');
  ATimezoneMinutes = iif(left(ATimezoneSign, 1) = '+', 1, -1)*(cast(substring( ATimezoneSign from 2 for 2) as int)*60 + cast(substring( ATimezoneSign from 5 for 2) as int));
  ATIMESTAMP = dateadd(minute, ATimezoneMinutes, ADATE + ATIME);
  suspend;
end
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Прибавить/убавить timezone к timestamp / 10 сообщений из 10, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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