【问题标题】:Mysql between dates is not working日期之间的Mysql不起作用
【发布时间】:2015-08-12 13:45:22
【问题描述】:

我正在编写以下查询以获取两个日期之间的记录。我正在使用Mysql 版本5.5。可能它的重复我不知道。但是没有答案对我有用,所以我在问。我正在关注最近日期之后的最小日期。即使它不起作用。

问题:空结果集。

pstmt=con.prepareStatement("SELECT urlid FROM youtubevideos WHERE lastwatched >=? AND lastwatched <=? order by id desc LIMIT 8");
pstmt.setString(1,previousdate);//14-05-2015
pstmt.setString(2,currentdate);//12-08-2015
rs=pstmt.executeQuery();
while(rs.next())
{
  .........
}

但我得到的是空的结果集。

我的表 youtubevideos 包含记录

  urlid   lastwatched
  -------------------
  url1    12-08-2015
  url2    11-08-2015
  url3    08-05-2015
  url4    
  url5    10-08-2015

以上是一些数据。这里lastwatchedvarcharlastwatched 对于某些记录是空的。如果我之前的日期08-05-2015 表示小于当前日期 (12),则上述查询有效。否则(从 13-05-2015 起)它不起作用。请有任何建议。

【问题讨论】:

  • 您能否回显您的查询并查看它的外观。可能是值被交换到了错误的地方。
  • 您的日期字段是如何定义的?如果您直接在数据库中使用查询,它可以工作吗?
  • @JordiCastilla 不,它不起作用。相同的空结果。我的日期是varchar
  • 貌似是java问题;设置 2 个值 - 如果我不得不猜测,我认为您将它们倒退,这就是您获得该输出的原因。我敢肯定,如果您在 from to 日期中运行 SELECT 和硬代码,它肯定会起作用 - 我每天都使用它(BETWEEN,而不是 >=)。祝你好运
  • mysql 不使用 2015-05-14 日期格式而不是 14-05-2015 日期格式吗?

标签: java mysql prepared-statement


【解决方案1】:

您使用了错误的 sql 日期格式:

12-08-2015 // this is the output format

改用yyyy-MM-dd

2015-08-12 // this is the sql store format

此查询在我的 Mysql 数据库中运行良好:

SELECT * FROM your_table where DATE <= "2015-05-08" AND DATE >= "2015-08-12"

要转换你的字符串:

Date initDate = new SimpleDateFormat("dd-MM-yyyy").parse(date);
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
String parsedDate = formatter.format(initDate);

【讨论】:

  • 但我的lastwatched 列属于dd-mm-yyyy。在java中我会改变yyyy-mm-dd的格式。
  • 所以你的数据库字段是varchar,而不是datetime
  • 完全正确。所以我需要改变这张桌子
【解决方案2】:

这里lastwatched 属于varchar

问题是您将日期字段存储为类型VARCHAR。如果您的日期格式为 Y-m-d,这将起作用,因为按字母顺序排序与按日期排序相同。

我建议您将 lastwatched 列更改为日期类型,这将允许 BETWEEN 正常工作,并且还可以访问 MySQL 中的日期函数。

【讨论】:

  • 同时更改表 ALTER TABLE youtubevideos MODIFY lastwatched DATE; 出现错误。这个对吗。 @吉姆
  • @Satya 您需要先将lastwatched 转换为日期,Gordon 的回答提供了一种方法。
【解决方案3】:

修复表格中的数据。您不应将真实日期存储为varchar()。 MySQL 为它们提供了一个很棒的数据类型,称为date(或者可能是datetime

这是一种方法:

alter table youtubevideos add column NEW_lastwatched date;

update youtubevideos
    set NEW_lastwatched = str_to_date(lastwatched, '%d-%m-%Y');

alter table drop column lastwatched;

alter table rename column NEW_lastwatched lastwatched date;

然后,以 ISO 标准格式 'YYYY-MM-DD' 传递您的参数,您使用此列的日期问题将得到解决。

【讨论】:

  • 我在这里遇到错误str_to_date('%d-%m-%Y'); 调用本机函数“str_to_date”时参数计数不正确。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-06
  • 1970-01-01
  • 2011-04-30
  • 2015-02-15
  • 1970-01-01
  • 1970-01-01
  • 2012-01-09
相关资源
最近更新 更多