Лучший способ сохранить время (hh:mm) в базе данных

Обновление: Java 9 Stream теперь поставляется с методом takeWhile .

Нет необходимости в хаках или других решениях. Просто используйте это!


Я уверен, что это может быть значительно улучшено: (кто-то может сделать его потокобезопасным, возможно)

Stream stream = Stream.iterate(0, n -> n + 1);

TakeWhile.stream(stream, n -> n < 10000)
         .forEach(n -> System.out.print((n == 0 ? "" + n : "," + n)));

Взломать наверняка .. Не элегантный - но он работает ~: D

class TakeWhile implements Iterator {

    private final Iterator iterator;
    private final Predicate predicate;
    private volatile T next;
    private volatile boolean keepGoing = true;

    public TakeWhile(Stream s, Predicate p) {
        this.iterator = s.iterator();
        this.predicate = p;
    }

    @Override
    public boolean hasNext() {
        if (!keepGoing) {
            return false;
        }
        if (next != null) {
            return true;
        }
        if (iterator.hasNext()) {
            next = iterator.next();
            keepGoing = predicate.test(next);
            if (!keepGoing) {
                next = null;
            }
        }
        return next != null;
    }

    @Override
    public T next() {
        if (next == null) {
            if (!hasNext()) {
                throw new NoSuchElementException("Sorry. Nothing for you.");
            }
        }
        T temp = next;
        next = null;
        return temp;
    }

    public static  Stream stream(Stream s, Predicate p) {
        TakeWhile tw = new TakeWhile(s, p);
        Spliterator split = Spliterators.spliterator(tw, Integer.MAX_VALUE, Spliterator.ORDERED);
        return StreamSupport.stream(split, false);
    }

}

92
задан Matthew Dresser 11 February 2009 в 20:57
поделиться

11 ответов

Вы могли сохранить его как целое число числа минут в прошлую полночь:

, например,

0 = 00:00 
60 = 01:00
252 = 04:12

необходимо было бы однако написать некоторый код для воссоздания времени, но это не должно быть хитро.

123
ответ дан BigJump 5 November 2019 в 13:42
поделиться

Попробуйте smalldatetime. Это не может дать Вам, что Вы хотите, но поможет, что Вам в Вашем будущем нужно в манипуляциях датой/временем.

1
ответ дан MarlonRibunal 5 November 2019 в 13:42
поделиться

Вместо минут мимо полуночи мы храним его, поскольку 24 часа синхронизируют как SMALLINT.

9:12 = 912 14:15 = 1415

при преобразовании назад в "человекочитаемую форму" мы просто вставляем двоеточие ":" два символа справа. Лево-клавиатура с нулями, если Вы должны. Сохраняет математику каждый путь и использует несколько, меньше байтов (по сравнению с varchar), плюс осуществляет это, значение является числовым (а не алфавитно-цифровым)

Довольно глупый, хотя... должен был быть тип данных ВРЕМЕНИ в MS SQL в течение многих лет уже, по моему скромному мнению...

1
ответ дан Kristen 5 November 2019 в 13:42
поделиться

Вы уверены, что Вам будут только когда-либо требоваться часы и минуты? Если Вы хотите сделать что-либо значимое с ним (как, например, вычисляют отрезки времени между двумя такими точками данных), не наличие информации о часовых поясах и DST может дать неправильные результаты. Часовые пояса, возможно, не применяются в Вашем случае, но DST несомненно будет.

1
ответ дан mghie 5 November 2019 в 13:42
поделиться

Я преобразовал бы их в целое число (HH*3600 + MM*60) и сохранил бы его тот путь. Небольшой размер ресурса хранения, и все еще достаточно легкий работать с.

2
ответ дан Glen Solsberry 5 November 2019 в 13:42
поделиться

так как Вы не упоминали, что это укусило, если Вы находитесь на SQL Server 2008, можно использовать тип данных времени, иначе используют минуты с полуночи

4
ответ дан SQLMenace 5 November 2019 в 13:42
поделиться

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

9
ответ дан Seth 5 November 2019 в 13:42
поделиться

Если Вы используете использование MySQL тип поля ВРЕМЕНИ и связанной функциональности, которая идет со ВРЕМЕНЕМ.

0:00:00 стандартный формат времени Unix.

, Если когда-нибудь необходимо оглядываться назад и рассматривать таблицы вручную, целые числа могут более сбивать с толку, чем фактическая метка времени.

2
ответ дан Syntax 5 November 2019 в 13:42
поделиться

Если Вы используете SQL Server 2008 +, рассматриваете TIME тип данных. статья SQLTeam с большим количеством примеров использования.

52
ответ дан p.campbell 5 November 2019 в 13:42
поделиться

SQL Server на самом деле хранит время как части дня. Например, 1 целый день = значение 1. 12 часов являются значением 0,5.

, Если бы Вы хотите сохранить временную стоимость, не используя тип ДАТЫ И ВРЕМЕНИ, храня время в десятичной форме, удовлетворил бы той потребности, также делая преобразование в ДАТУ И ВРЕМЯ простым.

, Например:

SELECT CAST(0.5 AS DATETIME)
--1900-01-01 12:00:00.000

Хранение значения, поскольку ДЕСЯТИЧНОЕ ЧИСЛО (9,9) использовало бы 5 байтов. Однако, если бы точность к не наибольшей важности, РЕАЛЬНОЕ использовало бы только 4 байта. В любом случае совокупное вычисление (т.е. среднее время) может быть легко вычислено на числовые значения, но не на типы Данных/Времени.

3
ответ дан Taylor Gerring 5 November 2019 в 13:42
поделиться

Как предложила Кристен, экономия времени в формате UTC может помочь лучше.

Убедитесь, что вы используете 24-часовой формат, потому что в UTC не используется меридиан AM или PM.

Пример:

  • 4:12 - 0412
  • 10:12 - 1012
  • 14:28 - 1428
  • 23:56 - 2356

По-прежнему предпочтительнее использовать стандарт четырехзначный формат.

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

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