0

当我们在 VBA 中定义记录集并从数据库中读取数据时,记录集将其数据类型转换为表的列数据类型。

Dim rs as adobb.RecordSet 
Set rs = CmdSqlData.Execute() ' After this rs fields will be stored based on table's datatype

有没有办法将记录集本身设置为字符串和执行,

Set rs = CmdSqlData.Execute()

例如:如果数据库表定义中有时间戳值(具有整数值),Recordsset 将其字段数据类型设置为时间戳。

问题是,在数据库中,

时间值是 12345 (不是日期和时间),但是当记录集读取它时,它来自例如:23-06-2012 10:15:23

我希望值为 12345

4

3 回答 3

2

您的 SELECT 语句将需要为 Teradata TIMESTAMP 执行显式 CAST 到 FLOAT(DATE 是 INTEGER)

SELECT CURRENT_TIMESTAMP()
     , CAST(CURRENT_TIMESTAMP() AS FLOAT) AS NumericTimeStamp
;

您应该能够解决 VBA 的其余部分,因为 Recordset 会将 NumericTimeStamp 识别为 FLOAT 而不是 TIMESTAMP。

编辑

以下 SELECT 语句将采用带有 FORMAT 子句的整数,并作为双重转换的结果返回字符数据类型:

SELECT CAST(CAST(1234 as INTEGER FORMAT '99:99:99') AS CHAR(8));

您是否尝试使用 SELECT 语句打开您的记录集,该语句将包含时间的列显式转换为 CHAR(8)?

于 2012-06-22T18:43:57.557 回答
1

我现在设法单独转换这个时间戳。但是有许多可用的时间戳格式。我无法自动化 SQL 查询以将不同的数据类型转换为字符串。我需要 VBA 以字符串形式读取 TERADATA VALUE 我做了什么,

    If Field_format = "99:99:99" then
    Sql = "Select Cast(Field_format as integer) from Mytable"
    Elseif Field_format = "99:99:99.999" then
    Sql = "Select Cast(Field_format as Float) from Mytable"
    Elseif Field_format = "99:99:99.999" then
    Sql = "Select Field_format from Mytable"
    End if
...
Set rs = CmdSqlData.Execute() 

请注意,teradata 中可用的数据类型太多(大约 400+),我无法像上面那样转换一切。

我只是想让 VBA 将 Teradata 值读取为字符串。 想知道 StackOverflow 中没有 VBA 专家

于 2012-06-25T14:54:51.463 回答
0

如果您连接到 SQL Server 数据库,时间戳数据类型是一个二进制字段,用于确定记录是否已更改(请参阅如何将 SQL Server 的时间戳列转换为日期时间格式)。这与保存时间和日期的日期时间字段不同。

从 ADO 中的记录集中返回一个字符串类似于:

Dim cn as ADODB.Connection
Dim rs as ADODB.Recordset
Dim strSQL as string
Dim strSomething as string

strSQL = "SELECT fld1 FROM tbl1"

Set cn = New ADODB.Connetion
cn.ConnectionString = {your connection string here}
cn.open
rs.open strSQL, cn
While Not rs.EOF
    strSomething = rs!fld1
Wend
rs.Close
cn.Close
Set rs = Nothing
Set cn = Nothing
于 2012-06-22T14:58:51.743 回答