2016-08-23 3 views
0

У меня есть поле типа Timestamp в моей базе данных MySQL. Я хочу перечислить все записи за определенную дату, скажем, 18/08/2016. Я хочу написать для этого запрос JPQL.Fetch Records для определенной даты из поля Timestamp

Я пытался использовать TRUNC(), to_DATE(), UNIX_TIMESTAMP(), myTimestamp = '2016-08-18' А.Н. несколько других способов, но ни один из них не похоже, работает.

Пожалуйста, предложите метод для этого.

+0

Проверить со временем, то он работает, как этот myTimestamp = «2016-08-18 15:53:57» –

ответ

0

Используйте дату() функцию MySQL, чтобы получить дату часть временной метки или поля даты и времени:

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

Всякий раз, когда я использую любую функцию, есть ошибка появляется в «(», заявив, что , , AND, GROUP, HAVING, ожидается, получил '('. – Random

+0

В MySQL не должно быть пробелов между именами функций и последующими скобками. 'MAX (col)' действительно. 'MAX (col)' нет. Это всего лишь один из этих маленьких причуд. –

+0

Это дает ту же ошибку с пробелами или без них – Random

1
  1. TIMESTAMP и DATETIME поля представляют как дату (например, 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. Эти функции преобразования обычно не стандартизируются между различными марками и моделями серверов РСУБД.

  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! */ 

Вы используете p.bookEntity.bookId в пункте WHERE. Это не правильно.

Вы также используете MySQL nonstandard extension to GROUP BY.

Возможно, ваш запрос должен сказать это. Вы должны протестировать этот запрос с помощью клиентской программы SQL, прежде чем пытаться создать его в своей программе Java.

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 
+0

Он дает {10, AND, GROUP, HAVING, ожидается, получил ошибку '('}, когда я использую функцию DATE. Удаление пространства перед скобкой также не работает. – Random

+0

Возможно, вы захотите спросить другого вопрос, показывающий запрос * whole *. Также сообщение, которое вы упомянули, не похоже на сообщение об ошибке синтаксиса MySQL. Вы уверены, что используете MySQL, а не какой-то другой сервер базы данных? –

+0

База данных - это MySQL, но я использую Hibernate JPA. В основном я пишу спящий запрос. String bookQuery = "SELECT b.name, b.publisher, sum (p.copies) FROM PurchaseEntity p, BookEntity b" + "WHERE p.bookEntity.bookId = b .bookId "+ " И дата (p.purchaseTime) = '2016-08-18' "+ "группа b.bookId"; Query BookQuery = entityManager.createQuery (bookQuery); Список < Object[] > resultListByUser = UserQuery.getResultList(); – Random