【问题标题】:Fetch Records for a particular date from Timestamp field从时间戳字段中获取特定日期的记录
【发布时间】:2016-12-30 03:28:58
【问题描述】:

我的 MySQL 数据库中有一个 Timestamp 类型的字段。我想列出特定日期的所有记录,比如 2016 年 8 月 18 日。 我想为此编写一个 JPQL 查询。

我尝试使用TRUNC()to_DATE()UNIX_TIMESTAMP()myTimestamp = '2016-08-18' 以及其他一些方法,但似乎都没有效果。

请为此建议一种方法。

【问题讨论】:

  • 检查一个时间然后它工作,就像这样 myTimestamp = '2016-08-18 15:53:57'

标签: java mysql date timestamp jpql


【解决方案1】:
  1. TIMESTAMPDATETIME 字段表示日期(如 2016-08-18)和时间(如 07:43:20)。这意味着myTimestamp = '2016-08-18' 不太可能出现true。仅当myTimestamp 具有精确值2016-08-18 00:00:00 时才成立。

  2. 当您将日期/时间值表示为文本时,您必须使用 ISO 格式,如下所示:

    2016-08-18 07:43:20

如果你想使用不同格式的文本,你可以,但你必须转换它using STR_TO_DATE() in MySQL。这些转换功能通常在不同品牌和型号的 RDBMS 服务器之间没有标准化。

  1. 要获取一天内的所有时间戳值,您需要搜索一个范围。这是最好的方法:

WHERE myTimestamp >= DATE('2016-08-18') AND myTimestamp < DATE('2016-08-18') + INTERVAL 1 DAY

这种搜索方法虽然比其他方法更冗长,但允许 MySQL 使用 myTimestamp 上的索引。如果您的表格有很多行,这可以节省大量时间。

数据库服务器的品牌和型号之间的日期和时间处理大多没有标准化。

编辑此处评论中的查询格式错误。它说:

SELECT b.name, b.publisher, sum(p.copies) 
  FROM PurchaseEntity p, BookEntity b  /* old-timey comma join! */
 WHERE p.bookEntity.bookId = b.bookId  /* wrong! */
   AND date(p.purchaseTime)= '2016-08-18'
 group by b.bookId  /* nonstandard! */

您在 WHERE 子句中使用了 p.bookEntity.bookId。这是不对的。

您也在使用 MySQL 的 nonstandard extension to GROUP BY

您的查询可能应该这样说。在尝试将其构建到 Java 程序中之前,您应该使用 SQL 客户端程序测试此查询。

SELECT b.name, b.publisher, sum(p.copies) 
  FROM PurchaseEntity p, 
  JOIN BookEntity b ON p.bookId = b.bookId 
   AND date(p.purchaseTime)= '2016-08-18'
 group by b.name, b.publisher

【讨论】:

  • 它给出了 { , , AND, GROUP, HAVING, IS expected, got '(' } error when I use the DATE function.删除括号前的空格是'也不行。
  • 您可能希望提出另一个显示整个查询的问题。此外,您提到的消息看起来不像 MySQL 语法错误消息。您确定您使用的是 MySQL 而不是其他数据库服务器吗?
  • 数据库是 MySQL 但我使用的是 Hibernate JPA。基本上我正在编写一个休眠查询。 String bookQuery= "SELECT b.name, b.publisher, sum(p.copies) FROM PurchaseEntity p, BookEntity b" + "WHERE p.bookEntity.bookId = b.bookId" + "AND date(p.purchaseTime)= ' 2016-08-18' " + "按 b.bookId 分组";查询 BookQuery = entityManager.createQuery(bookQuery);列表 resultListByUser = UserQuery.getResultList();
【解决方案2】:

使用 date() MySQL 函数获取时间戳或日期时间字段的日期部分:

select * from yourtable where date(timestamp_field)= '2016-08-18'

【讨论】:

  • 每当我使用任何函数时,'(' 处都会出现错误,说明 、AND、GROUP、HAVING、IS 预期得到 '(' 。
  • 在 MySQL 中,函数名和后面的括号之间可能没有空格。 MAX(col) 有效。 MAX (col) 不是。这只是其中一个小怪癖。
  • @Random 在不知道任何细节的情况下提供任何有意义的答案有点困难。 Ollie 和我创建的查询在 MySQL 中工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-19
  • 1970-01-01
  • 2014-03-25
相关资源
最近更新 更多