日期作为字段名称在 MS 访问中无法识别

date as name of field not recognized in ms access

我的字段名称为交货日期,您可以在此处看到: 我有大约 75 个这样的列。当我想计算值 P1 时出现错误,因为它找不到该字段。顺便说一句,我的系数 T1、T2(它们是日期)的值非常奇怪,因此 A 和 B 是 datediff。有代码:

 Sub vcm_fc()
    Dim db As Database, T As Date, longest As Integer, nearest_date As Date, rsb As DAO.Recordset, strsqlb As String
    Dim strsqla As String, rsa As Recordset, maturity As Date, T1 As Date, T2 As Date, P1 As Double, P2 As Double
    Dim a As Integer, B As Integer, j As Integer, rsc As DAO.Recordset, strqlc As String, settlementbis As String
    Dim settlement As String, maturitybis As Date, ym As Integer, ymbis As Integer
        Set db = CurrentDb()
        T = DateSerial(2020, 8, 15)
        nearest_date = DFirst("PricingDate", "fc_historical")
        longest = DateDiff("m", nearest_date, T)
         db.Execute "CREATE TABLE time_series " _
                    & "(PricingDate CHAR);"
        db.Execute " INSERT INTO time_series " _
            & "SELECT PricingDate " _
            & "FROM fc_historical " _
            & "ORDER BY PricingDate;"
               For i = 1 To longest
                db.Execute " ALTER TABLE time_series " _
                    & "ADD COLUMN F_" & i & " Number;"
                 strsqla = "SELECT PricingDate, F_" & i & " FROM time_series ORDER BY PricingDate"
                 Set rsa = db.OpenRecordset(strsqla, dbOpenDynaset)
                 rsa.MoveFirst
                 rsa.Delete 'delete the first row which is blank when the time series table is created'
                 rsa.MoveFirst
                 While (Not rsa.EOF())
                 rsa.Edit
                 maturity = DateAdd("m", i, rsa.Fields("PricingDate").Value)
                 ym = Year(maturity) - 2000
                 settlement = "1/" & Month(maturity) & "/" & ym
                 strsqlb = "SELECT Pricingdate, " & settlement & " FROM fc_historical ORDER BY PricingDate;"
                 Set rsb = db.OpenRecordset(strsqlb, dbOpenDynaset)
                 rsb.MoveLast
                 T1 = rsb.Fields("PricingDate").Value
                 maturitybis = DateAdd("m", i, maturity)
                 ymbis = Year(maturitybis) - 2000
                 settlementbis = "1/" & Month(maturitybis) & "/" & ymbis
                 strsqlc = "SELECT Pricingdate, " & settlementbis & " FROM fc_historical ORDER BY PricingDate;"
                 Set rsc = db.OpenRecordset(strsqlc, dbOpenDynaset)
                 rsc.MoveLast
                 T2 = rsc.Fields("PricingDate").Value
                 a = DateDiff("d", T1, rsa.Fields("PricingDate").Value)
                 B = DateDiff("d", rsa.Fields("PricingDate").Value, T2)
                 P1 = rsb.Fields(settlement).Value
                 P2 = rsc.Fields(settlementbis).Value
                 rsa.Fields("F_" & i) = (P1 * B + P2 * a) / (a + B)
                 rsa.Update
                 rsa.MoveNext
                 Wend
        Next i
End Sub

使用格式正确的日期表达式:

settlementbis = "#" & CStr(ymbis) & "/" & CStr(Month(maturitybis)) & "/1#"

并且一定要听听 Darren 关于规范化的内容。

已添加为答案,以便我可以获得代码的格式。此代码将采用您的日期字段名称并将它们作为记录值 - 您可能需要弄乱 fld.Name 以确保它不是美国日期格式(1 月 8 日、1 月 9 日等 table 示例)以及该日期的价格。

Sub Put_Field_Names_As_Record_Values()

    Dim DB As DAO.Database
    Dim OldTable As DAO.TableDef
    Dim fld As DAO.Field

    Set DB = CurrentDb()
    Set OldTable = DB.TableDefs("time_series")

    DoCmd.SetWarnings False
    For Each fld In OldTable.Fields
        If IsDate(fld.Name) Then
            Debug.Print fld.Name & " : " & SQLDate(fld.Name)
            DoCmd.RunSQL "INSERT INTO MyNewTable (PricingDate, SettlementDate, Price) " & _
                "SELECT PricingDate," & SQLDate(fld.Name) & ", [" & fld.Name & "] FROM time_series"
        End If
    Next fld
    DoCmd.SetWarnings True

End Sub

Function SQLDate(varDate As Variant) As String
    'Purpose:    Return a delimited string in the date format used natively by JET SQL.
    'Argument:   A date/time value.
    'Note:       Returns just the date format if the argument has no time component,
    '                or a date/time format if it does.
    'Author:     Allen Browne. allen@allenbrowne.com, June 2006.
    If IsDate(varDate) Then
        If DateValue(varDate) = varDate Then
            SQLDate = Format$(varDate, "\#mm\/dd\/yyyy\#")
        Else
            SQLDate = Format$(varDate, "\#mm\/dd\/yyyy hh\:nn\:ss\#")
        End If
    End If
End Function

然后您可以 运行 在 table 上查询:

SELECT  SUM(Price) 
FROM    MyNewTable 
WHERE   PricingDate<=#07/16/2014# AND SettlementDate=#01/08/2014#

编辑:在您的数据库副本上进行测试!!
编辑 2:手动创建 MyNewTable 并将 PricingDate 和 SettlementDate 设置为关键字段。

我已更新以将字段名称转换为正确的日期 - http://allenbrowne.com/ser-36.html
在我的测试中,它正确地将所有日期转换为每个月的第一天。