Как правильно использовать функцию DATEDIFF, когда datetime хранится в БД в формате UTC, но вы хотите найти разницу в днях - PullRequest
0 голосов
/ 11 сентября 2018

Вариант использования: Мне нужно получить список задач, которые являются целевыми или просроченными из базы данных.Задание считается выполненным, если задание выполнено в течение 3 дней и просрочено через 3 дня после назначенной даты.

Например:

Если назначена дата:6 сентября, тогда любое задание до конца 9 сентября будет объявлено о цели, но с 10 сентября оно будет просрочено.

Проблема в том, что мы сохраняем назначенную дату как дату и время в UTC в базе данных. Допустим, пользователь находится вCST так для него

  • 6 сентября 00:00:00 CST - 6 сентября 05:00:00 UTC
  • 6 сентября 19:00:00 CST - 7 сентября 00:00: 00 UTC
  • 6 сентября 23:59:59 CST 7 сентября 04:59:59 UTC

Теперь, как вы видите для пользователя, который находится в CST всю его дату для6-е сентября может быть представлено двумя датами в UTC (т.е. 6-е и 7-е сентября)

Итак, когда мы делаем DATEDIFF (day, assign_date, currentdate) <= 3 </strong>, скажем, текущая дата10 сентября,

  • Выпуск 1:

Когда назначено_ <<6 сентября 19:00:00 CST, который7 сентября 00: 00: 00 UTC), это будет 6-10 -> 4 дня, что правильно, но когда assign_date> (6 сентября 19:00:00 CST, 7 сентября 00:00:00 UTC) и <(6 сентября)23:59:59 CST - 7 сентября 04:59:59 UTC) это будет 7-10-> 3 дня и, следовательно, не будет считаться просроченным, что неправильно.(Что касается пользователя, сегодняшняя дата по-прежнему 6 сентября, и, следовательно, ее следует рассматривать как просроченную)

  • Выпуск 2:

Кроме того, я могу проверить эту задачу 10 сентября позже, после 10 сентября 19:00:00 CST, которая будет принимать текущую дату как 11 сентября вместо 10 сентября, что снова будет проблемой, которой я все еще могу управлять при отправкеэто из внешнего интерфейса, но assign_date хранится в базе данных как datetime.

  • Проблема 3:

Я подумал об использованиисмещение в java для преобразования функции DATEDIFF в функцию DATEADD, которая сначала преобразует assign_date (который является datetime) в требуемый часовой пояс, предоставляя смещение, а затем CAST его до даты, но проблема заключается в том, что смещение может зависеть от того, какой месяц является дневнымЭкономия времени может изменить смещение для UTC.Пример:

package datetime;

import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;

public class UTCOffset {

    public static void main(String args[]) {
        Calendar obj= Calendar.getInstance();
        obj.setTimeZone(TimeZone.getTimeZone("PST"));
        obj.set(2018,11,12); 
        System.out.println(obj.getTimeZone().getOffset(obj.getTimeInMillis())/3600000); //In November-> DayLight -> Returns -6
        Date d = new Date(); Today 9th Sept
        System.out.println(obj.getTimeZone().getOffset(d.getTime())/3600000); // Today in September returns -5
    }

}

Итак, смещение также отличается в зависимости от даты.

Может ли кто-нибудь указать, как мы можем решить эти проблемы?

...