Показать сообщение отдельно
Старый 12.02.2010, 17:01   #17  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,448 / 1786 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от lev Посмотреть сообщение
Аксаптовскими средствами можно решить все, просто с бОльшими трудозатратами
А неужели преоброзование типов работает быстрее пары лишних сравнений?

Цитата:
Сообщение от lev Посмотреть сообщение
Например, есть таблицы:
Table1 с полями: FromDate, FromTime, ToDate, ToTime
Table2 с полями: FromDate, FromTime, ToDate, ToTime
известно значение Table2, нужно проверить есть ли пересекающиеся во времени строчки в Table1...
вот такой случай решается в аксапте геморойно
Вообще эта задача ничуть не сложнее предыдущей. В том смысле, что для её решения нужно то же число сравнений.
X++:
((T1.fromDate < T2.toDate) || ((T1.fromDate == T2.toDate) && (T1.fromTime <= T2.toTime))) &&
((T1.toDate > T2.fromDate) || ((T1.toDate == T2.fromDate) && (T1.toTime >= T2.fromTime)))

P.S.: Накатал тут на коленке пару макросов для работы с датами и временем. Может кому пригодится.
X++:
#localmacro.lessOrEq
    /* (%1) - Date_1 */
    /* (%2) - Time_1 */
    /* (%3) - Date_2 */
    /* (%4) - Time_2 */
    ( ((%1) < (%3)) || ( ((%1) == (%3)) && ((%2) < (%4)) ) )
#endmacro

#localmacro.greatOrEq
    /*(%1) - Date_1 */
    /*(%2) - Time_1 */
    /*(%3) - Date_2 */
    /*(%4) - Time_2 */
    ( ((%1) > (%3)) || ( ((%1) == (%3)) && ((%2) > (%4)) ) )
#endmacro

#localmacro.dt
    /* (%1) - Date */
    /* (%2) - Time */
    %1, %2
#endmacro

#localmacro.between
    /* (%1) - DateFrom */
    /* (%2) - TimeFrom */
    /* (%3) - DateTo   */
    /* (%4) - TimeTo   */
    /* (%5) - Date     */
    /* (%6) - Time     */
    (#greatOrEq(#dt(%5, %6), #dt(%1, %2)) && #lessOrEq(#dt(%5, %6), #dt(%3, %4)))
#endmacro

#localmacro.cross
    /* (%1) - DateFrom_1 */
    /* (%2) - TimeFrom_1 */
    /* (%3) - DateTo_1   */
    /* (%4) - TimeTo_1   */
    /* (%5) - DateFrom_2 */
    /* (%6) - TimeFrom_2 */
    /* (%7) - DateTo_2   */
    /* (%8) - TimeTo_2   */
    (#lessOrEq(#dt(%1, %2), #dt(%7, %8)) && #greatOrEq(#dt(%3, %4), #dt(%5, %6)))
#endmacro
За это сообщение автора поблагодарили: nix0root (1).