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
日期格式不一致的VBA Insert语句中的DateAdd存在MS访问问题_Date_Ms Access_Sql Insert_Dateadd - Fatal编程技术网

日期格式不一致的VBA Insert语句中的DateAdd存在MS访问问题

日期格式不一致的VBA Insert语句中的DateAdd存在MS访问问题,date,ms-access,sql-insert,dateadd,Date,Ms Access,Sql Insert,Dateadd,我在数据库中如何存储日期方面遇到问题 我需要创建一个临时TableC,其中将为TableC上的每条记录插入X条记录。其中X是周数。生成的表将在UNION语句中与其他几个查询一起使用 问题在于DateAdd如何为每个新记录创建日期。日期最初以dd/mm/yyyy格式存储。但是结果是DateAddww,i,rst![Date]有时会以mm/dd/yyyy格式存储,在30K结果行中造成严重破坏 Sub AddItems() Dim db as DAO.Database Dim rs

我在数据库中如何存储日期方面遇到问题

我需要创建一个临时TableC,其中将为TableC上的每条记录插入X条记录。其中X是周数。生成的表将在UNION语句中与其他几个查询一起使用

问题在于DateAdd如何为每个新记录创建日期。日期最初以dd/mm/yyyy格式存储。但是结果是DateAddww,i,rst![Date]有时会以mm/dd/yyyy格式存储,在30K结果行中造成严重破坏

Sub AddItems()
    Dim db as DAO.Database
    Dim rst as DAO.Recordset
    Dim Sql1, Sql2 as String

    Sql1 = "SELECT [a].*, [b].[Date], [b].[Weeks]. [b].[Rate] FROM TableA as [a] LEFT JOIN TableB as [b] WHERE [a].[GroupId] = [b].[Id] ORDER BY [b].[Date], [a].[Id];"

    Set db = CurrentDb
    Set rst = db.OpenRecordset(Sql1)

    rst.movefirst
    While NOT rst.EOF
        If rst![Weeks] > 0 Then
            For i = 1 to rst![Weeks]
                Sql2 = "INSERT INTO TableC ([ID], [CUSTOMER], [DATE], [AMOUNT]) VALUES ("
                Sql2 = Sql2 & rst![ID] & ", " & rst![CUSTOMER]
                Sql2 = Sql2 & "#" & Format(DateAdd("ww", (i - 1), Format(rst![Date], "mm/dd/yyyy")), "mm/dd/yyyy") & "#"
                Sql2 = Sql2 & ", " & rst![AMOUNT]
                Sql2 = Sql2 & ")"
                Debug.Print Format(DateAdd("ww", (i - 1), Format(rst![Date], "mm/dd/yyyy")), "mm/dd/yyyy")
                db.Execute(Sql2)
            Next i
        End If
        rst.movenext
    Wend
End Sub  
编写了一个VB Sub来创建表,下面是一个示例,说明了表的实际存储方式与预期的情况

结果表样本 +-------+------+------+ |周|表上|调试时|插入预期数据 +-------+------+------+ |1 | 2019年2月12日| 2019年2月12日|应为2019年12月2日 ||截至2月12日|正确| +-------+------+------+ |2 | 2019年9月12日| 2019年12月9日|应为2019年12月9日 ||截至9月12日|正确| +-------+------+------+ |3 | 2019年12月16日| 2019年12月16日|应为2019年12月16日 ||正确|正确| +-------+------+------+ 即时窗口上打印的结果是正确的,但实际表格上的信息是不正确的。我的样本数据开始于2019年12月2日2019年12月2日,已通过表A中表格视图上的日期选择器确认

“调试”窗口显示了要存储的正确信息,但即使TableC中的字段[DATE]格式为短日期并使用IsDate验证规则,表上的信息也不正确

如果没有这两个格式语句,结果将与预期的结果完全不同。然而,生成的日期字段并不一致


是否有一种方法可以根据系统设置一致地生成日期并存储它们?

如果数据类型为日期,则日期值不会以某种格式存储。格式仅用于显示或在SQL中连接时使用。因此,请尝试:

子附加项 Dim数据库作为DAO.Database 将rst设置为DAO.Recordset 将Sql1设置为字符串 将Sql2设置为字符串 Sql1=选择[a]..[b].[Date],[b].[Weeks]。[b] 表a中的[Rate]作为[a]左连接表b作为[b],其中[a].[GroupId]=[b].[Id]按[b].[Date],[a].[Id]排序; Set db=CurrentDb 设置rst=db.OpenRecordsetSql1 rst.MoveFirst 而不是rst.EOF 如果是rst![周]>0那么 对于i=1到rst![周] Sql2=插入表C中的[ID]、[CUSTOMER]、[DATE]、[AMOUNT]值 Sql2=Sql2&rst![ID]&,“&rst!”![客户]&, Sql2=Sql2&&FormatDateAddww,i-1,rst![日期],年月日和, Sql2=Sql2&Strrst![金额] Sql2=Sql2& 调试。打印FormatDateAddww,i-1,rst![日期],年月日 db.ExecuteSql2 接下来我 如果结束 rst.MoveNext 温德 端接头 这就是说,为TableC打开第二个记录集,然后使用AddNew和Update来追加这几周的记录,会更简单、更快

如果您的日期存储为文本,则除了手动编辑以使其格式一致外,没有其他方法可以解决您的问题。

首先请注意:

变量i根本没有声明,您应该在模块的头中使用Option Explicit来启用VBE来警告您。 Date是一个保留字,所以我将它重命名为YourDate。 变量sql1被隐式定义为类型变量。 您对变量sql1的SQL定义在语法上不正确。我纠正了它,希望它是你的意思。 我希望您的表字段YourDate是日期类型,而不是字符串。如果它是string,那么您需要在代码中首先将其转换为date,或者在表中更好地转换为date。 如果要隐式地使用属性值来清除所做的操作,并且不要意外地指定对象,请始终显式地使用属性值。 在SQL注入的情况下,连接SQL字符串是不安全的。面向对象的方法不是,它是类型安全的。 这应该如您所期望的那样起作用:


请共享tableC的表定义。是否将日期存储为文本?如果没有删除格式,谢谢。。。非常优雅地使用了方块。我定义了变量,并实际使用了一个日期类型的变量来计算,然后将其传递给相应的参数,这就起作用了。还发现了另一种解决方法,在INSERT子句中使用DateSerialYearMyDate、MonthMyDate、DayMyDate,而不使用and,同样有效。
Option Compare Database
Option Explicit

Sub AddItems()
    Dim sql1 As String
    sql1 = "SELECT a.*, b.YourDate, b.Weeks, b.Rate FROM TableA as a LEFT JOIN TableB as b On a.GroupId = b.Id ORDER BY b.YourDate, a.Id"

    Dim db As DAO.Database
    Set db = CurrentDb

    Dim rst As DAO.Recordset
    Set rst = db.OpenRecordset(sql1)

    rst.MoveFirst
    While Not rst.EOF
        If rst("Weeks").Value > 0 Then
            Dim i As Long
            For i = 1 To rst("Weeks").Value
                With CurrentDb().CreateQueryDef(vbNullString, _
                    "INSERT INTO TableC ([ID], [CUSTOMER], [YourDATE], [AMOUNT]) " & _
                    "VALUES (@ParID, @ParCustomer, @ParDate, @ParAmount)")
                    .Parameters("@ParID").Value = rst("ID").Value
                    .Parameters("@ParCustomer").Value = rst("CUSTOMER").Value
                    .Parameters("@ParDate").Value = DateAdd("ww", (i - 1), rst("YourDate").Value)
                    .Parameters("@ParAmount").Value = rst("AMOUNT").Value
                    .Execute dbFailOnError
                End With
            Next i
        End If
        rst.MoveNext
    Wend

    rst.Close
End Sub