2015-10-14 75 views
2

Excel的日期時間值看起來像42291.60493,這意味着MySQL把它們視爲字符串而不是日期。 有沒有可以將它們轉換爲MySQL datetime的MySQL代碼? (即like in MS SQLMySQL代碼轉換Excel日期時間

+0

我想你導入從CSV數據不擅長。 –

+0

你如何從Excel中獲取數據到MySQL?使用Excel本身可能更容易在導出時轉換爲標準日期時間格式。這可能是最簡單的,它肯定會是正確的。 –

+0

我在Excel中使用帶有參數(如日期)的Microsoft Query。我可以重新格式化Excel中的日期,直到我心中的喜悅,但這只是在Excel中顯示。 – LWC

回答

2

我能想到的2個解決方案:

  1. Excel內將您的日期,使用Excel內的文字()函數符合MySQL的日期和時間格式格式化的日期字符串。

  2. 轉換MySQL的內使用計算日期的數量:

(下面的表達式可以被簡化)

select date_add(date_add(date('1899-12-31'), interval floor(@datefromexcel) day), interval floor(86400*(@datefromexcel-floor(@datefromexcel))) second) 
+0

好的答案。如果你需要微秒來正確舍入,修改爲date_add(date_add(date '1899-12-31'),間隔層(@datefromexcel)日),間隔層(86400000000 *(@ datefromexcel-floor(@datefromexcel)))微秒) – jdog

1

Excel將日期時間存儲爲自1899-12-31以來的天數。 Unix存儲自1970-01-01以來的秒數,但只允許非負值。

因此,對於日期,你可以做

select date_add(date('1899-12-31'), interval $Exceldate day) 

這並不適用於小數個工作日內。但是,對於unix日期時間,這將是很好的:

select $ExcelDate*24*60*60 + unix_timstamp('1899-12-31') 

但負值是有問題的。因此,這需要如下所示:

select ($ExcelDate - datediff('1899-12-31', '1970-01-01')) * 24*60*60 

也就是說,只需計算自Unix截止日期以來的秒數。注意:這裏假定日期在1970-01-01之後,因爲MySQL在截斷之前不理解unix日期。

+0

date_add()對於mysql有不同的語法:date_add(date('1899-12-31'),interval $ Exceldate day) – Shadow

+0

另外還有一個額外的「(」在最後一行,唉,有點道歉,我編輯過OP反映我的意思是MySQL日期時間,而不是Unix日期時間。你能編輯相應的答案嗎? – LWC

+0

@Shadow。。。Thank you。 –