MySQL日期范围查询

8

已修复 - 这是我现在拥有的 - 使用ASP编写

If Session("dateRange") = "Today" Then
        fromDate = Date()
        fromDate = Year(fromDate)&"-"&Month(fromDate)&"-"&Day(fromDate)
        whereClause = whereClause & "AND dateCreated = '"&fromDate&"' "
ElseIf Session("dateRange") = "Yesterday" Then
        fromDate = DateAdd("d",-1,Date())
        fromDate = Year(fromDate)&"-"&Month(fromDate)&"-"&Day(fromDate)
        whereClause = whereClause & "AND dateCreated = '"&fromDate&"' "
ElseIf Session("dateRange") = "1 Week" Then
        fromDate = DateAdd("d",-7,Date())
        fromDate = Year(fromDate)&"-"&Month(fromDate)&"-"&Day(fromDate)
        whereClause = whereClause & "AND dateCreated BETWEEN '"&fromDate&"' AND '"&toDate&"' "
ElseIf Session("dateRange") = "1 Month" Then
        fromDate = DateAdd("m",-1,Date())
        fromDate = Year(fromDate)&"-"&Month(fromDate)&"-"&Day(fromDate)
        whereClause = whereClause & "AND dateCreated BETWEEN '"&fromDate&"' AND '"&toDate&"' "
ElseIf Session("dateRange") = "3 Months" Then
        fromDate = DateAdd("m",-3,Date())
        fromDate = Year(fromDate)&"-"&Month(fromDate)&"-"&Day(fromDate)
        whereClause = whereClause & "AND dateCreated BETWEEN '"&fromDate&"' AND '"&toDate&"' "
ElseIf Session("dateRange") = "6 Months" Then
        fromDate = DateAdd("m",-6,Date())
        fromDate = Year(fromDate)&"-"&Month(fromDate)&"-"&Day(fromDate)
        whereClause = whereClause & "AND dateCreated BETWEEN '"&fromDate&"' AND '"&toDate&"' "
ElseIf Session("dateRange") = "1 Year" Then
        fromDate = DateAdd("yyyy",-1,Date())
        fromDate = Year(fromDate)&"-"&Month(fromDate)&"-"&Day(fromDate)
        whereClause = whereClause & "AND dateCreated BETWEEN '"&fromDate&"' AND '"&toDate&"' " 
End If

原始问题:

这是一个简单的问题,但是我不知道为什么无法解决它。

我有一个搜索框,旁边是一个日期范围选择菜单,所以用户可以搜索最近1个月、6个月或12个月内的照片。

我的代码没有错误,但是当它应该产生结果时却没有任何结果:

WHERE dateCreated BETWEEN "&DateAdd("m",-6,Date())&" AND "&Date()&"

SQL的输出结果如下:
dateCreated BETWEEN 18/03/2011 AND 18/09/2011 ORDER BY dateCreated DESC

数据库中的'dateCreated'字段被设置为(Date INDEX)。

有人能看出问题在哪里吗?


你确定没有错误吗? - Mat
你的 SQL 中的日期应该用单引号括起来,并且格式为 yyyy-mm-dd - Asaph
5个回答

31

你生成的SQL语句中的日期应该用单引号括起来。尝试将查询的动态部分用引号括起来,例如:

WHERE dateCreated BETWEEN '"&DateAdd("m",-6,Date())&"' AND '"&Date()&"'

我假设这将生成以下 SQL:

dateCreated BETWEEN '18/03/2011' AND '18/09/2011' ORDER BY dateCreated DESC

此外,请尝试找到一种方法来以更常见的MySQL yyyy-mm-dd格式格式化日期。就像这样:

dateCreated BETWEEN '2011-03-18' AND '2011-09-18' ORDER BY dateCreated DESC

1
谢谢Asaph,现在它可以工作了。我的旧日期脚本来自于一个“裤子”访问数据库设置。所以我所做的就是删除了“#”,认为这就是我需要做的全部。我讨厌日期格式和数据库!! - TheCarver

7
如果你特别是从“现在”开始往回看,为什么不执行以下操作?
where DateCreated >= DATE_SUB( CURDATE(), INTERVAL 1 MONTH )
where DateCreated >= DATE_SUB( CURDATE(), INTERVAL 6 MONTH )
where DateCreated >= DATE_SUB( CURDATE(), INTERVAL 12 MONTH )

不需要“范围”,只需插入您想要允许的月份范围即可...

实际上,并非所有的搜索都使用“范围”,用户可以插入两个日期以查找更具体的范围...但是...如果用户使用基本范围,我可以仅为此构建SQL,如果他们输入了两个日期,我也可以仅为此构建SQL,因为我相信您的建议对于向后查找更快。 - TheCarver

2

%d-%m-%Y 不是一个正确的日期格式,而且在MySQL中日期值应该总是像字符串和ISO 8601('%Y-%m-%d')格式一样加上引号。 18/03/2011 将被解释为仅仅是 18 除以 032011 的结果,这大约是 0.002…

也就是说,你的SQL应该像以下形式:

dateCreated BETWEEN '2011-03-18' AND '2011-09-18' ORDER BY dateCreated DESC

0

不确定您在使用什么技术来使用DateAdd(),但是您的最终日期格式不正确,而且您的日期值没有用单引号括起来。

MySQL将日期比较为2011-03-18而不是18/03/2011

请注意,您可以使用MySQL的日期时间函数来执行此操作。尽管这可能会防止查询被缓存。


0
如果这些字符串没有加引号,我认为你实际上只是在进行除法运算,然后比较一个非常短的时间范围内的日期。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接