2012-01-05 35 views
0

我不知道如何去创建一个Java表达式,它采用格式为“1999-12-30 12:34:45”的日期变量并将其转换为一个Int控件“19991230 ”。日期为“日期键”为int

这可能是其他人会感激的东西,尤其是人们提取和清理数据以加载到数据仓库中。

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

想法?

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

+2

您所描述的操作实在是微不足道。但是,我不认为有人会使用这个。大多数人使用真实数据或unixtime。 – 2012-01-05 16:17:46

+0

为什么要将'Date'存储为'Integer'? – mre 2012-01-05 16:18:03

+0

@mre:整数是整数。简单,小(依赖),跨平台。 – 2012-01-05 16:35:32

回答

2

很容易使用SimpleDateFormat类来做到这一点。但是,正如其他人提到的,您可能应该将数据库时间戳记存储为数据库时间戳记列,而不是以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 

    } 
+0

而不是将时间戳存储到日期维度的外键将使我能够访问除日期时间之外的其他几件事情。这就是为什么我想将日期转换为int。 的日期键某些外部参一拉金博尔:http://forum.kimballgroup.com/t334-eliminate-date-dimension-surrogate-key – Geuder 2012-01-05 23:58:15

+0

@Geuder - 好吧。我上面提供的应该为你做的伎俩。 – CoolBeans 2012-01-06 00:01:00

+0

@Geuder如果有帮助,请接受答案。您可以通过点击答案旁边的勾号来接受。这将鼓励你的问题的未来答案,获得你的声望点,最重要的是,你会有一个很好的接受比例。 – CoolBeans 2012-01-06 16:55:27

0

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

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

+0

用户想要int中的yearmonthday格式,getTime()返回自上一个纪元以来的毫秒数。不是一回事。 – 2012-01-05 16:25:25

+0

嗯,这个想法是“干净”的数据与数据仓库使用...存储不能在SQL中使用平凡没有引起太大意义,我 – 2012-01-05 16:29:17

0

虽然我同意寻找评议,这是奇怪的,如果我真的需要转换日期为长我会使用它返回自01.01毫秒长代表量date.getTime() 0.1970。

好东西,它可以很容易地变回一个日期(Java有一个构造,我怀疑其他语言做的一样好)

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。你真的不想扔掉有用的数据!

+0

不要忘子的格式(日期0,8 )在replaceAll()之前的日期字符串上的replaceAll()或子字符串(0,10)之后返回日期而不是时间。 – 2012-01-05 16:28:05

+0

我也想知道这是如何与SimpleDateFormat.parse()相比较的,这当然不是那么冗长,但RegEx在Java中并不总是表现正常。 – 2012-01-05 16:32:42

+0

2147483647是Integer的最大值,因此在日期和时间调用parseInt都会导致NumberFormatException。当然,在使用该方法时,可以使用long或BigInteger替换int。 – 2012-01-05 23:57:53

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

0

你可以只使用类似:

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

,然后所有你需要做的就是日期对象的值,例如:

var timeStamp=dateObj.valueOf(); 

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

转换回用:

var newTime=new Date(timeStamp); 
0

使用的SimpleDateFormat,SimpleDateFormat.parse,SimpleDateFormat.format和的Integer.parseInt [http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html]

1)创建一个SimpleDateFormat的字符串解析成一个日期对象

2)创建一个SimpleDateFormat将Date对象格式化为

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

然而,存储日期为仓储一个int没有多大意义了我。

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

+0

在我的情况下,我已经有一个日期对象。您将如何创建一个单线程,包括解决方案的第2步和第3步? – Geuder 2012-01-06 10:07:00

+0

此外,它不是“强制”这个要求的限制。将日期维度的外键作为int内存有效且可索引 - >分析速度。 – Geuder 2012-01-06 10:09:37

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

感谢您的所有建议,意见和建议。 这正是我一直在寻找:

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

row.date(由拓蓝开放工作室)持有我想变成一个int日期密钥的日期。

0

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

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

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

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

  • 如果您不必涉及日期维度,那么按日期或日期范围进行自加入效率更高。

  • 最重要的是,日期算术可以直接在表格上完成,而无需针对维度进行连接。在“2012-01-15”之前180天计算日期比2012011年更容易。另外,SQL没有从20120015到相应日期的本机转换,而无需在维度中查看它。

+0

我同意。如果可能的话,将日期与事实一起存储可能是有用的。 – Geuder 2012-04-12 22:07:17