基于 Excel 文件数据库上的日期的 SQL 查询
Posted
技术标签:
【中文标题】基于 Excel 文件数据库上的日期的 SQL 查询【英文标题】:SQL query based on date on an Excel file database 【发布时间】: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 时是否遇到任何错误?
不,我只是没有得到结果
【参考方案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<='" + CStr(CLng(CDate(EndDateTextBox.Value))) + "' AND CREATION_DATE>='" + 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 表的工作原理以上是关于基于 Excel 文件数据库上的日期的 SQL 查询的主要内容,如果未能解决你的问题,请参考以下文章
将我的日期列从 Excel 导入/转换为 SQL Server 中的日期时间数据类型?
将 Excel 导入 SQL 将日期存储为 ASP.NET 中的数值