2012-01-05 64 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