2017-10-24 1 views
0

Bitte akzeptieren Sie meine Entschuldigung für mein schlechtes Englisch. In unserem Projekt verwenden wir spring.jpa.properties.hibernate.jdbc.time_zone = UTC, um LocalDateTime in UTC zu speichern; und wir müssen das Ergebnis nach Datum nach Benutzerzeitzone gruppieren; Also brauche ich eine JPQL (JPA) -Anweisung zu gruppieren nach Datum unter Berücksichtigung der Benutzer-Zeitzone wie Oracle FROM_TZ() -Funktion, oder wenn es eine Möglichkeit gibt, Unterschied Benutzer Zone Zeit und UTC-Zeit zu der Spalte zu addieren/Gruppieren durch?JPQL Gruppe nach Datum nach Benutzer Zeitzone

+0

Nehmen Benutzer Zeit -> Konvertieren es in UTC tz -> Ihre Datenbankabfrage. –

+0

Ich verstehe es nicht !! Ihre Daten werden als UTC gespeichert. Um jetzt die übereinstimmenden Daten aus der Datenbank zu erhalten, müssen Sie zuerst das benutzerspezifische Zeitzone-spezifische Datum in die UTC ändern und dann die Datenbank abfragen, um die spezifischen Zeilen zu erhalten. Es gibt viele Möglichkeiten, Datum in bestimmte Zeitzonen zu konvertieren. Check [this] (https://stackoverflow.com/q/22768905/3094731) –

+0

@AbdullahKhan Vielen Dank für die schnelle Antwort, aber mein Problem ist die UTC-Datum Spalte zu Benutzerzone Zeit und Gruppierung von diesen neuen Zeiten zu konvertieren. Betrachten Sie zum Beispiel gespeicherte Geburtstage in UTC wie folgt: 20171023 21: 00: 00/ ** 20171023 22: 30: 00 **/ ** 20171023 23: 00: 00 **/ ** 20171024 00:30 00 **/ ** 20171024 01: 30: 00 **/ ** 20171024 08: 00: 00 **/ 20171024 23:00:00 Also, wenn ein Benutzer zählt täglich Geburtstage sehen aus Paris Zeitzone [UTC/GMT +2 Stunden], er/sie erwartet: 20171023: ** 1 **/ 20171024: ** 5 **/ 20171025: ** 1 ** –

Antwort

0

Endlich fand ich die Antwort; hoffe, dass es nützlich für wen/wen es braucht.

ZonedDateTime zoneIdNow = ZonedDateTime.now(zonedId); 
ZonedDateTime utcNow = zoneIdNow.toLocalDateTime().atZone(ZoneOffset.UTC); 
Duration durationBetweenZoneIdAndUtc = Duration.between(zoneIdNow, utcNow); 
float dayDiffBetweenZoneIdAndUtc = (float) durationBetweenZoneIdAndUtc.getSeconds()/(24 * 60 * 60); 

entityManager 
.createQuery("select cast(cast(p.birthday + " + dayDiffBetweenZoneIdAndUtc 
+ " as timestamp) as date) as bd, count(p.id) from Person p " 
+ "group by cast(cast(p.birthday + " + dayDiffBetweenZoneIdAndUtc 
+ " as timestamp) as date)").getResultList()