【问题标题】:SQL query based on date on an Excel file database基于 Excel 文件数据库上的日期的 SQL 查询
【发布时间】:2015-05-07 06:44:40
【问题描述】:

我使用 ADO 对 Excel 文件数据库执行 SQL 查询,但在使用以下查询时遇到问题:

strQuery = "SELECT NUM,CREATION_DATE,CREATOR,STATE,LAST_MODIFICATION_DATE,LAST_MODIFIER,CATEGORY,MODEL_LABEL FROM [MySheet$] WHERE CREATION_DATE<='" + EndDateTextBox.Value + "' AND CREATION_DATE>='" + BeginDateTextBox.Value + "'"

查询已执行,但是当我在 BeginDateTextBox 中输入 2010-01-01 和在 EndDateTextBox 中输入 2016-01-01 时,我没有得到任何结果,这是不正常的,因为我的数据库中的日期在 2014 年和2015.

这是我的数据库的 CREATION_DATE 列的屏幕截图:

PS:我知道使用 Excel 文件作为数据库不是最佳做法,但有人告诉我这样做。

【问题讨论】:

  • 检查日期的格式。尝试将其改为01/01/2010 格式,看看是否有效。
  • 您必须将日期转换为正确的日期格式(dd/mm/yyy hh:mm:ss)
  • 这两种方案我都试过了,不行
  • 您在尝试@otus 时是否遇到任何错误?
  • 不,我只是没有得到结果

标签: sql database vba excel


【解决方案1】:

您需要将日期转换为值,ADO 无法识别工作表中单元格的格式,只有值适用。所以最终的查询应该是这样的:

SELECT * FROM [MySheet$] WHERE CREATION_DATE <= 42370 AND CREATION_DATE >= 40179

您可以使用这种方法来实现:

Sub test()
Dim DtStart as Long
DtStart = Clng(Cdate("2010-01-01"))
Msgbox DtStart
End Sub

所以,最终的 SQL 查询将是:

strQuery = "SELECT NUM,CREATION_DATE,CREATOR,STATE,LAST_MODIFICATION_DATE,LAST_MODIFIER,CATEGORY,MODEL_LABEL " & _
           "FROM [MySheet$] " & _
           "WHERE CREATION_DATE <= " & CLng(CDate(EndDateTextBox.Value)) & _
           "  AND CREATION_DATE >= " & CLng(CDate(BeginDateTextBox.Value)) 

或者可以是这样的:

strQuery = "SELECT NUM,CREATION_DATE,CREATOR,STATE,LAST_MODIFICATION_DATE,LAST_MODIFIER,CATEGORY,MODEL_LABEL " & _
           "FROM [MySheet$] " & _
           "WHERE CREATION_DATE BETWEEN " & _ 
            CLng(CDate(BeginDateTextBox.Value)) & " AND " & CLng(CDate(EndDateTextBox.Value)) 

这里是测试结果:

【讨论】:

  • 如何在 SQL 查询中转换数据库中的日期?
  • @otus 你不需要在数据库中转换日期,你需要将日期从文本框转换为值,所以2010-01-01应该是40179
  • 我将查询修改为:strQuery = "SELECT NUM,CREATION_DATE,CREATOR,STATE,LAST_MODIFICATION_DATE,LAST_MODIFIER,CATEGORY,MODEL_LABEL FROM [MySheet$] WHERE CREATION_DATE&lt;='" + CStr(CLng(CDate(EndDateTextBox.Value))) + "' AND CREATION_DATE&gt;='" + CStr(CLng(CDate(BeginDateTextBox.Value))) + "'",但我仍然没有得到结果,我使用“2010-10-10”作为开始日期和“2016-10-10”对其进行了测试作为结束日期
  • @you 不需要转换为 Cstr,因为 Excel 中的日期是一个格式为日期的值,请参阅我的更新帖子
  • 其实我在不使用cstr的时候会得到一个错误信息,“标准表达式中的数据类型不兼容”(我把错误信息从法语翻译过来,英文可能有点不同)
【解决方案2】:
convert(datetime,CREATION_DATE,103) >= convert(datetime, BeginDateTextBox.Value ,103)

对 begindatetextbox 和 enddatetextbox 都这样做

这应该将您的日期都转换为 dd/mm/yyyy 格式(不是 100% 确定它是否适用于您可能需要先转换为字符串的日期),以便您可以以相同的格式比较它们

这是直接的 sql(begindatetextbox.value 除外),所以它不会像这样工作,你必须在代码中构建你的字符串,最终看起来像这样

【讨论】:

  • 尝试此解决方案时出现此错误:错误 -2147214900 表达式中未定义“转换”函数(我从法语翻译了错误消息)
  • 好吧,让我看看为什么这不起作用,我会回复你
  • 顺便说一句,你有什么样的数据库? mysql、oracle、access?
  • 我使用 Excel 文件作为数据库和 ADO 通过 vba 代码访问它
  • 这可能是它不起作用的原因,我将不得不查看转换对 excel 表的工作原理
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-02
  • 2021-02-17
  • 1970-01-01
  • 2021-11-14
  • 2017-02-27
  • 1970-01-01
相关资源
最近更新 更多