Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 日期作为ms access中无法识别的字段名称_Sql_Date_Ms Access_Vba_Field - Fatal编程技术网

Sql 日期作为ms access中无法识别的字段名称

Sql 日期作为ms access中无法识别的字段名称,sql,date,ms-access,vba,field,Sql,Date,Ms Access,Vba,Field,我有一些字段的名称是交货日期,您可以在这里看到: 我有大约75个这样的专栏。当我想计算值P1时,我有一个错误,因为它找不到字段。顺便说一句,我的系数T1,T2是日期,因此A和B是日期差。代码如下: 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 S

我有一些字段的名称是交货日期,您可以在这里看到: 我有大约75个这样的专栏。当我想计算值P1时,我有一个错误,因为它找不到字段。顺便说一句,我的系数T1,T2是日期,因此A和B是日期差。代码如下:

 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,以确保它不是表示例的US date格式1月8日、1月9日等,以及该日期的价格

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
然后可以对表运行查询:

SELECT  SUM(Price) 
FROM    MyNewTable 
WHERE   PricingDate<=#07/16/2014# AND SettlementDate=#01/08/2014#
编辑:在数据库副本上测试!! 编辑2:手动创建MyNewTable并将PricingDate和SettlementDate设置为关键字段

我已更新以将字段名转换为正确的日期-
在我的测试中,它将所有日期正确地转换为每个月的第一个日期。

我不会这样设计表-看起来完全反对关系数据库理论和规范化。而是有3列—PricingDate、OldFieldHeadingDate和Value。然后,您的表可以从PricingDate=somedate和OldFieldHeadingDate=somedate的表中选择值。同一日期在PricingDate中会多次出现-然后可能会使用PricingDate和OldFieldHeadingDate作为主键。数据库规则1-它不是电子表格:这些字段是结算日期和大约两周前的交易停止点。然后,我们的想法是为每个月的交易停止之前的所有不同时段建立一个新的时间序列表。对于每个日期,新价格是该日期最近停止交易日期的价格的加权平均值+我们保持固定的交易停止之前的期间。此外,我不仅有3列,还有75列。但是,如果我了解你的想法,我可以为结算日期创建一个指数,然后我可以计算新的价格,不是吗?是的,指数将是第一个字段和第二个字段的组合-不需要75个字段,只有三个字段。如果价格是计算出来的,你可以很容易地编写一个查询来处理同一个表中较早的PricingDate/SettlementDate记录。顺便问一下,你知道如何将字段的名称放在一列中,然后将其用作主键吗?我之前已经试过了,但错误仍然存在。对不起,我想你正在创建以日期为标题的列。正如其他人已经提到的,您需要完全重新设计您的概念。Access不是电子表格。所有日期都是欧洲格式的,因此列的日期是8月1日和9月1日。所有结算都是每个月的第一个。对于日期的格式,我用以下代码解决了我的pb问题:选择PricingDate,&DateSerialYearfld.Name,Dayfld.Name,Monthfld.Name&,[&fld.Name&]FROM fc_historical,其中[&fld.Name&]在0到1000000000000之间,按PricingDate排序