【问题标题】:Access VBA: SQL String with string tablefield converted as date访问 VBA:将字符串表字段转换为日期的 SQL 字符串
【发布时间】:2017-02-20 09:50:51
【问题描述】:

通常我通过反复试验在VBASQL 中找出我的DateTime 问题,但在这种情况下我碰壁了。

我什至不确定我能做我想做的事。

我有一个包含 F1、F2 等字段的临时表。

字段 F7 包含一个日期,格式为 dd/MM/yyyy 的字符串。

现在,我想将临时表中的数据复制到应将字段 F7 中的数据存储在 Date/Time 字段中的表中。此字段的格式为短日期 (dd-MM-yyyy)。

我尝试过单独使用CDate()Format()Trim() 以及几种组合,同时用## 填充我的日期数据并将括号[] 添加到我的表fieldname,但我根本找不到正确的组合。

这是我的代码。 importedDate 工作正常,因为我使用的是变量。但是对于 F7 字段,我将 SQL 查询与 VBA 日期转换混合在一起,这对我不起作用:

Sub MoveImportedData()
Dim SQLStr As String


SQLStr = "INSERT INTO TblDebitorSaldoListe " _
& "(CompanyCode,CompanyName, CustomerNumber, CustomerName, OneTimeCustomerName, TermsOfPayment, NetDueDate, Reference, " _
& "DunningBlock,Comment, ReminderOne, ReminderTwo, DebtCollection, TotalAmountDKK, TotalNotYetDueDKK, TotalOverdueDKK, " _
& "ReminderOneFile, ReminderTwoFile, NoReminder, ImportedDate) " _
& "SELECT F1, F2, F3, F4, F5, F6, #" & CDate("F7") & "#, F8, F9, '', '', '', '', F10, F11, F12, '', '', 0, '" & CDate(Date) & "' " _
& "FROM TEMP WHERE Len(F1)=4" _

MsgBox SQLStr

DoCmd.RunSQL SQLStr

End Sub

任何帮助将不胜感激。我正在使用 Access 2013。

谢谢。

【问题讨论】:

  • 您能否添加您尝试使用的代码来转换DataType?可能是您在这里使用的代码有问题?
  • 我已经尝试过这种组合: & "SELECT F1, F2, F3, F4, F5, F6, 'CDate(Format(Trim(F7), " & Chr(34) & "dd -mm-yyyy" & Chr(34) & "))', F8, F9, '', '', '', '', F10, F11, F12, '', '', 0, '" & CDate (日期) & "'" _
  • 您能否将变量(例如newDate)声明为DateTime 的类型。运行SELECT 查询以获取 F7 的值,然后对该值运行 VBA 转换命令,然后以这种方式插入?它可能需要一个循环来为每一行执行此操作,因此不是最有效的方法,但只是为了检查它是否有效。
  • 嗨,大卫。谢谢回复。我会试试的。
  • 你好。我认为我的问题是我的日期在我们在丹麦使用的“23.10.2016”表格上。使用 Replace(date, ".", "-") 似乎对我有用,让我继续。

标签: sql datetime ms-access vba


【解决方案1】:

其实很简单:

& "SELECT F1, F2, F3, F4, F5, F6, DateValue(F7), F8, F9, '', '', '', '', F10, F11, F12, '', '', 0, Date() " _

或者,如果 F7 带有点(更正为带有替换的单引号):

& "SELECT F1, F2, F3, F4, F5, F6, DateValue(Replace(F7, '.', '-')), F8, F9, '', '', '', '', F10, F11, F12, '', '', 0, Date() " _

【讨论】:

  • 抱歉,Replace 的引号混淆了。已更正。
【解决方案2】:

按照古斯塔夫的建议工作。

DateValue 不起作用,可能是因为我的丹麦语言环境。我认为它返回了错误的日期格式(对我来说),这导致 NULL 被插入到表的 F7 字段中。也就是说这不起作用,但可能适用于具有不同日期格式的其他人:

& "SELECT F1, F2, F3, F4, F5, F6, DateValue(Replace(F7, ""."", ""-"")), F8, F9, '', '', '', '', F10, F11, F12, '', '', 0, Date() " _

但是CDate 解决了我的问题并添加了额外的"。这对我有用:

& "SELECT F1, F2, F3, F4, F5, F6, CDate(Replace(F7, ""."", ""-"")), F8, F9, '', '', '', '', F10, F11, F12, '', '', 0, Date() " _

非常感谢你们提供快速而有用的帮助!

【讨论】:

  • DateValue 将转换像 '23-10-2016' 这样的字符串。此外,除了纯整数,不应该有 DateValue 不能转换 CDate 可以转换的表达式。那么,请问您的数据到底是什么样的?
  • 它包含表单上的数据:25.02.2017 08.10.2016 01.12.2016 02.01.2017 21.10.2016
  • DateValue 将在替换点后转换这些,因此必须进行其他操作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-12
  • 2018-03-03
  • 1970-01-01
  • 1970-01-01
  • 2015-08-24
相关资源
最近更新 更多