Дата как Int для "ключа даты" - PullRequest
0 голосов
/ 05 января 2012

Интересно, как создать выражение в Java, которое принимает переменную даты, отформатированную как "1999-12-30 12:34:45", и преобразует ее в Int, содержащее "19991230".

Вероятно, это будет то, что другие оценят, особенно те, кто извлекает и очищает данные для загрузки в хранилище данных.

Мне кажется, нужно изменить шаблон даты, преобразовать в строку, обрезать первую часть (8 символов) и преобразовать в int.

Идеи

(обновление) Мой плохой в объяснении проблемы. Получившийся int будет служить в качестве ключа / идентификатора Fk для измерения даты. Аналогичная операция должна быть сделана для создания ключа к измерению времени суток. Int уменьшит размер, используемый в таблице фактов, в которой будут храниться эти ключи int. Смотрите связанный ответ: https://stackoverflow.com/a/8416548/1132571

Ответы [ 10 ]

2 голосов
/ 05 января 2012

Довольно легко сделать это, используя класс SimpleDateFormat . Однако, как уже упоминали другие, вы, вероятно, должны хранить метку времени эпохи в виде столбца Database TimeStamp, а не сохранять дату в виде int. Это приведет к проблемам позже, когда вы будете манипулировать данными с помощью SQL.

public static void main(String[] args) throws ParseException {
        String dateStr = "1999-12-30 12:34:45";
        String formatStr = "yyyy-MM-dd HH:mm:ss";
        String formatStrOther = "yyyyMMdd";
        Date testDate = null;
        SimpleDateFormat sdf= new SimpleDateFormat(formatStr);
        SimpleDateFormat sdfOther= new SimpleDateFormat(formatStrOther);
        sdf.setLenient(false);
        testDate = sdf.parse(dateStr);
        Integer otherDate = Integer.valueOf(sdfOther.format(testDate));
        System.out.println("Newly formatted date in int is: " + otherDate); //prints Newly formatted date in int is: 19991230

    }
1 голос
/ 05 января 2012

Просто удалите специальные символы и затем конвертируйте в int

Integer.parseInt("1999-12-30 12:34:45".replaceAll("[- :]", ""));

, в вашем случае вам нужна только дата, а не время, поэтому это будет:

Integer.parseInt("1999-12-30 12:34:45".substring(0,10).replaceAll("-", ""));

Я должен отметить, что это работает, только если исходный формат правильный ... и это на самом деле довольно уродливо, я бы предпочел использовать long и getTime - и, возможно, simpleDateFormat.Вы действительно не хотите выбрасывать полезные данные!

0 голосов
/ 12 января 2012

Во многих отношениях вам лучше оставить ключи даты в качестве дат, хотя вы, возможно, захотите урезать их по дням.Если вам нужна фактическая дата и время, сохраните ее отдельно.Для этого есть ряд причин, в основном связанных с арифметикой дат.

  • Вычисление диапазонов дат в таблице фактов может быть выполнено без объединения с измерением даты.

  • Запросы возвращают дату - это весьма эффективно, если вы просто выполняете специальный запрос к таблице.

  • Специальные значения для «до», 'after', 'error' могут быть выбраны, поэтому они все еще довольно очевидны ('1800-01-01', '9000-01-01' '6666-01-01' и т. д.).

  • Самостоятельные объединения по дате или диапазону дат более эффективны, если вам не нужно включать измерение даты.

  • Самое главное, арифметика даты может быть выполненанепосредственно на столе без необходимости присоединяться к измерению.Вычислить дату за 180 дней до «2012-01-15» проще, чем сделать это для 20120115. Кроме того, SQL не имеет собственного преобразования из 20120015 в соответствующую дату без поиска в измерении.

0 голосов
/ 07 января 2012

Спасибо за все предложения, отзывы и предложения.Вот что я искал:

Integer.parseInt(new SimpleDateFormat("yyyyMMdd").format(row.date));

Где row.date (из Talend Open Studio) содержит дату, которую я хотел преобразовать в ключ даты int.

0 голосов
/ 05 января 2012

И еще один. (Я не люблю разбирать строки, слишком подвержен ошибкам с датами.; -))

DateFormat format = new SimpleDateFormat("dd-MM-yyyy");

Date d;
try {

    d = (Date)format.parse("30-12-1999");
    Calendar c = Calendar.getInstance();
    c.setTime(d);

    int result = c.get(Calendar.YEAR) * 100*100 + 
                (c.get(Calendar.MONTH) + 1) * 100 + 
                 c.get(Calendar.DAY_OF_MONTH);

    System.out.println(result);

} catch (ParseException e) {
    e.printStackTrace();
}
0 голосов
/ 05 января 2012

Используйте SimpleDateFormat, SimpleDateFormat.parse, SimpleDateFormat.format и Integer.parseInt [http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html]

1) создайте SimpleDateFormat для анализа строки в объекте Date

2) создайте SimpleDateFormat для форматирования объекта Date в строковое представление объекта in

3) используйте Integer.parseInt для изменения недавно отформатированного String в int.

Однако, сохраняя датутак как int для складирования не имеет для меня особого смысла.

Я предполагаю, что есть какое-то ограничение, не позволяющее вам использовать либо Date, либо String в формате ISO 8601.

0 голосов
/ 05 января 2012

вы можете просто использовать что-то вроде:

var dateObj=new Date("1999-12-30 12:34:45");

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

var timeStamp=dateObj.valueOf();

это дастмиллисекунды с 1970 года, универсальная система времени, которая используется большинством компьютерных систем.

для обратного использования:

var newTime=new Date(timeStamp);
0 голосов
/ 05 января 2012

Предполагая, что формат остается прежним:

String dateStr = "1999-12-30 12:34:45";
dateStr = dateStr.substring(0, 10);
dateStr = dateStr.replace("-", "");
int n = Integer.parseInt(dateStr);
System.out.println(n);

Отпечатки: 19991230

0 голосов
/ 05 января 2012

Хотя я согласен с комментаторами в том, что это странно, но если бы мне действительно нужно было преобразовать дату в длинную, я бы использовал date.getTime(), который возвращает длинную, представляющую количество миллисекунд с 01.01.1970.

Хорошая вещь заключается в том, что его легко можно превратить в дату (у Java есть конструктор для этого, я подозреваю, что и другие языки тоже)

0 голосов
/ 05 января 2012

getTime даст вам длинный доступ к этой информации, int не будет достаточно большим.

http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Date.html#getTime()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...