Сравнение диапазонов даты

Исключение нулевого указателя - это индикатор того, что вы используете объект, не инициализируя его.

Например, ниже - класс ученика, который будет использовать его в нашем коде.

public class Student {

    private int id;

    public int getId() {
        return this.id;
    }

    public setId(int newId) {
        this.id = newId;
    }
}

Приведенный ниже код дает вам исключение с нулевым указателем.

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}

Поскольку вы используете Obj_Student, но вы забыли инициализировать его, как в правильном коде, показанном ниже:

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student = new Student();
            obj_Student.setId(12);
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}
114
задан fthiella 9 October 2014 в 10:19
поделиться

4 ответа

Это - классическая проблема, и на самом деле легче при инвертировании логики.

Позволяют мне дать Вам пример.

я отправлю один промежуток времени здесь и все различные изменения других периодов то перекрытие в некотором роде.

           |-------------------|          compare to this one
               |---------|                contained within
           |----------|                   contained within, equal start
                   |-----------|          contained within, equal end
           |-------------------|          contained within, equal start+end
     |------------|                       not fully contained, overlaps start
                   |---------------|      not fully contained, overlaps end
     |-------------------------|          overlaps start, bigger
           |-----------------------|      overlaps end, bigger
     |------------------------------|     overlaps entire period

, с другой стороны, позвольте мне отправить все те, который не накладывается:

           |-------------------|          compare to this one
     |---|                                ends before
                                 |---|    starts after

Поэтому, если Вы простой уменьшаете сравнение с:

starts after end
ends before start

тогда Вы найдете все теми, который не накладывается, и затем Вы найдете все периоды несоответствия.

Для Вашего финала НЕ В примере СПИСКА, Вы видите, что это соответствует тем двум правилам.

необходимо будет решить, являются ли следующие периоды В или ВНЕ диапазонов:

           |-------------|
   |-------|                       equal end with start of comparison period
                         |-----|   equal start with end of comparison period

, Если Ваша таблица имеет столбцы, названные range_end и range_start, вот некоторый простой SQL для получения всех строк соответствия:

SELECT *
FROM periods
WHERE NOT (range_start > @check_period_end
           OR range_end < @check_period_start)

Примечание НЕ там. Начиная с двух простых правил находит весь несоответствие строки, простое НЕ инвертирует его для высказывания: , если это не одна из строк несоответствия, это должен быть один из соответствия .

Применение простой логики реверсирования здесь для избавлений от НЕ и Вы закончите с:

SELECT *
FROM periods
WHERE range_start <= @check_period_end
      AND range_end >= @check_period_start
417
ответ дан kay 24 November 2019 в 02:28
поделиться

Взятие Вашего примера располагается от 06.06.1983 до 18.06.1983 и предположение, что у Вас есть столбцы, названные , запускаются и конец для Ваших диапазонов, Вы могли использовать пункт как это

where ('1983-06-06' <= end) and ('1983-06-18' >= start)

т.е. проверить, что запуск Вашего тестового диапазона перед концом диапазона базы данных, и что конец Вашего тестового диапазона после или на запуске диапазона базы данных.

8
ответ дан Paul Dixon 24 November 2019 в 02:28
поделиться

Если Ваш RDBMS поддерживает ПЕРЕКРЫТИЕ () функция тогда, это становится тривиальным - никакая потребность в решениях собственной разработки. (В Oracle это, по-видимому, работает, но не документировано).

4
ответ дан Matthew Schinckel 24 November 2019 в 02:28
поделиться

В Ваших ожидаемых результатах Вы говорите

06.06.1983 к 18.06.1983 = В СПИСКЕ

Однако, этот период не содержит, ни содержится любым из периодов в Вашей таблице (не, перечисляют!) периодов. Это действительно, однако, перекрывает период 06.10.1983 до 14.06.1983.

можно найти книгу Snodgrass ( http://www.cs.arizona.edu/people/rts/tdbbook.pdf ) полезный: это предшествует mysql, но понятие времени не изменилось;-)

0
ответ дан onedaywhen 24 November 2019 в 02:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: