【问题标题】:MySQL Date BetweenMySQL 日期之间
【发布时间】:2011-11-19 19:49:50
【问题描述】:

已修复 - 这就是我现在所拥有的 - 用 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”字段设置为(日期索引)。

谁能看出问题所在?

【问题讨论】:

  • 你确定没有错误吗?
  • SQL 中的日期应该用单引号引起来。格式为yyyy-mm-dd

标签: mysql sql database


【解决方案1】:

生成的 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

【讨论】:

  • 感谢 Asaph,现在可以使用了。我的旧日期脚本来自“裤子”访问数据库设置。所以我所做的只是删除了“#”的想法,这就是我需要做的。我讨厌日期格式和数据库!!
【解决方案2】:

如果您是专门从“现在”向后看,为什么不这样做

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,因为我相信你的建议对于向后看会更快
【解决方案3】:

%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

【讨论】:

    【解决方案4】:

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

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

    注意,您可以在 MySQL 中使用 Date Time Functions 执行此操作。尽管它可能阻止查询被缓存。

    【讨论】:

      【解决方案5】:

      如果这些字符串没有被引用,我相信你实际上只是在做除法,然后在一个非常小的时间范围内比较日期。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-01-09
        • 2012-09-05
        • 2013-04-27
        • 1970-01-01
        • 2017-11-16
        • 2016-11-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多