日期为“日期密钥”的Int

时间:2012-01-05 16:15:53

标签: java date data-warehouse etl

我想知道如何在Java中创建一个表达式,该表达式将日期变量格式化为“1999-12-30 12:34:45”并将其转换为Int持有“19991230”。

这可能是其他人会欣赏的,特别是人们提取和清理数据以加载到数据仓库中。

我的猜测是需要更改日期模式,转换为字符串,截断第一部分(8个字符)并转换为int。

想法?

(更新) 我不好解释这个问题。 生成的int将作为日期维度的键/ Fk id。应该执行类似的操作来创建时间维度的键。 int将减少事实表中消耗的大小,其中将存储这些int键。请参阅相关答案:https://stackoverflow.com/a/8416548/1132571

10 个答案:

答案 0 :(得分:2)

使用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 :(得分:1)

只需删除特殊字符,然后转换为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。你真的不想扔掉有用的数据!

答案 2 :(得分:0)

getTime会给你一个很长的信息,int不够大。

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

答案 3 :(得分:0)

虽然我同意评论者发现这很奇怪,如果我真的需要将日期转换为长日期,我会使用date.getTime()返回一个代表自1970年1月1日以来的毫秒数的长。< / p>

好处是它可以很容易地变回日期(Java有一个构造函数,我怀疑其他语言也是如此)

答案 4 :(得分:0)

假设格式保持不变:

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

答案 5 :(得分:0)

你可以使用类似的东西:

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

然后您需要做的就是获取日期对象的值,如下所示:

var timeStamp=dateObj.valueOf();

这将给你自1970年以来的毫秒,这是一个大多数计算机系统使用的通用时间系统。

转换回使用:

var newTime=new Date(timeStamp);

答案 6 :(得分:0)

使用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

的String表示形式

3)使用Integer.parseInt将新格式化的String更改为int。

但是,将日期存储为仓库的int对我来说没有多大意义。

我想有一些限制阻止您使用ISO 8601格式的日期或字符串。

答案 7 :(得分:0)

另一个。 (我不喜欢解析字符串,也不喜欢日期。; - ))

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();
}

答案 8 :(得分:0)

感谢所有建议,意见和建议。 这就是我想要的:

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

row.date(来自Talend Open Studio)保存我想要转换为int日期密钥的日期。

答案 9 :(得分:0)

在很多方面,您最好将日期键保留为日期,尽管您可能希望在关键日期截断日期。如果您还需要实际日期时间,请单独存储。这有很多原因,主要与日期算术有关。

  • 可以在不加入日期维度的情况下计算事实表上的日期范围。

  • 查询将返回日期 - 如果您只是在桌面上进行临时查询,这非常有效。

  • 可以选择“之前”,“之后”,“错误”的特殊值,因此它们仍然相当明显('1800-01-01','9000-01-01''6666-01 -01'等。)。

  • 如果您不必涉及日期维度,则按日期或日期范围进行自我联接会更有效。

  • 最重要的是,日期算术可以直接在表格上完成,而无需加入维度。在'2012-01-15'之前180天计算日期比在20120115执行日期更容易。此外,SQL没有从20120015到相应日期的本机转换,而没有在维度中查找。