2

我会定期从 DB/2 数据库中提取日期和时间戳,格式如下:

2002-01-15-00.00.00.000000
2008-01-05-12.36.05.190000
9999-12-31-24.00.00.000000

有没有比用子字符串分解更简单的方法将其转换为 Excel 日期格式?

DB2date = DateValue(Left(a, 4) + "/" + Mid(a, 6, 2) + "/" + Mid(a, 9, 2))

感谢您的帮助!

4

4 回答 4

2

不清楚您是在谈论公式函数还是 VBA 函数。

公式函数

不要使用 DateValue 函数,它需要一个字符串;使用 Date 函数,它需要数字年、月、日:

=DATE(INT(LEFT(A1,4)),INT(MID(A1,6,2)),INT(MID(A1,9,2)))

假设日期字符串在 A1 中。

VBA 函数

与上面类似的计算,只需使用DateSerial函数代替:

dt= DateSerial(Int(Left$(dt$, 4), Int(Mid$(dt$, 6, 2)), Int(Mid$(dt$, 9, 2)))
于 2008-10-03T10:32:16.237 回答
1

如果你真的愿意的话,我相信你可以用 Regex 做点什么。但它不会有任何“更好”,可能更糟。

如果你能原谅一点 C#(我已经很多年没有接触过 VB,所以我不再知道函数调用了)你也可以这样做:

DB2string = "2002-01-15-00.00.00.000000";
DB2date = DateValue(DB2string.SubString(0, 10).Replace('-', '/'));

但同样,你并没有真正获得任何东西。你能举例说明你当前的代码会在哪里中断吗?

于 2008-10-03T10:19:41.300 回答
1

在 VBA 中,dateValue()可以将字符串的第一部分转换为日期:

? dateValue("2002-01-15")

    15/01/2002

因此,为您获取它的正确方法是

? dateValue(left("2002-01-15-00.00.00.000000",10))

只要 DB2 始终为您提供“YYYY-MM-DD”日期,这将始终为您提供正确的答案。结果的格式(dd/mm/yy、mm-ddd-yyyy 等)将取决于您计算机的本地设置/单元格的特定设置。

如果你想提取字符串的“时间”部分,这个timeValue()函数最终会完成这项工作。

于 2008-10-03T10:41:01.007 回答
1

如果您想包含时间信息,您还有更多工作要做;DateValue 丢弃它。
TimeValue 可以将时间部分评估为秒,因此您可以添加它们:

= DateValue(Mid(a, 1, 10)) + TimeValue(Mid(a, 12, 8))

但是您的示例数据存在另一个问题:它同时具有时间值“00.00.00”和“24.00.00”。
第二个阻塞了 TimeValue 函数,因此您需要针对特殊情况编写代码。

于 2008-10-03T15:44:27.470 回答