2010-01-22 4 views
3

Я понимаю, что в соответствии с Interbase v6 Firebird 2.5 не поддерживает ключевое слово SQL-92 INTERVAL. По крайней мере, так предлагает this reference и мои повторяющиеся ошибки SQLCODE -104, пытающиеся получить INTERVAL s для работы в Firebird's isql (1).Firebird 2.1 TIMESTAMP арифметические и гражданские интервалы

Как же я объясняю несоответствия в нашем гражданском расчете времени - месяцы неравномерны, а также дни с экономией времени и корректировки прыжка, не говоря уже о годе путаницы и т. Д. - при выполнении TIMESTAMP арифметики под Firebird 2.1?

Как я могу легко определить «на месяц раньше» или «на одну неделю позже», чем заданный TIMESTAMP? Как насчет «на следующий день» или «за два часа до»?

ответ

5

Вы можете использовать встроенные функции DateAdd()210 и DateDiff().
В качестве альтернативы вы также можете использовать классический date arithmetic.

+1

"Классический" ариф. не позволяет работать с гражданскими интервалами в качестве операнда, но DATEADD и DATEDIFF кажутся на месте. (Однако я не могу убедить какой-либо из методов распознать изменение сэкономленного времени, которое произошло в моем часовом поясе в 2009-03-08 - слишком плохо.) – pilcrow

+2

@pilcrow: вы не можете распознать изменения DST, поскольку это предполагает, что дата/время будет локальным. Функции as-is, похоже, работают с системным временем, что хорошо, поскольку база данных всегда должна хранить отметки времени в UTC. – mghie

+0

@mghie, моя система и мой сервер Firebird находятся по местному времени. – pilcrow

1

Если это не реализовано в Firebird, возможно, вы могли бы это сделать с помощью технологии, вызывающей ваш сервер sql, и получить итоговую временную метку? Я знаю, что это может быть легко сделано на Java или .Net

+0

Это, безусловно, возможная альтернатива, Бишибоуш, но я бы предпочел бы разработать правильную логику SQL или серверную логику один раз, чем несколько раз с различными клиентами, если это вообще возможно. – pilcrow

1

Вы также можете использовать functions внешнего UDF fbudf.dll

1

Существует хороший внешний UDF имени rFunc: http://rfunc.sourceforge.net/, он имеет хорошие функции Date как DaysBetween и IncDate (d, i1, i2, i3) и многое другое

0
  1. Вычесть один день с даты отметки времени в цикле до тех пор, пока месяц не изменится.
  2. Вычтите один день с даты отметки времени в цикле до тех пор, пока день не изменится на ВОСКРЕСЕНЬ.