基于 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&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 表的工作原理

以上是关于基于 Excel 文件数据库上的日期的 SQL 查询的主要内容,如果未能解决你的问题,请参考以下文章

PLSQL中SQL语句怎样转换日期型函数为字符型?

将我的日期列从 Excel 导入/转换为 SQL Server 中的日期时间数据类型?

将 Excel 导入 SQL 将日期存储为 ASP.NET 中的数值

将excel中数据用JAVA代码导入到oracle中,遇到日期类型应该怎么处理!?

基于日期在 R 中导入数据

基于日期时间值的相同表上的高效sql子查询