拥有一个MySQL数据库,其默认时区是Linux上的系统时区,即UTC。
CREATE TABLE `event_schedule` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`description` varchar(30) DEFAULT NULL,
`event_id` varchar(30) NOT NULL DEFAULT,
`event_type_id` varchar(30) NOT NULL DEFAULT,
`event_date` datetime DEFAULT NULL,
`event_date_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00'
)
内容如下:
| 1 | karoake | aab3223 | 2 | 2017-08-15 00:00:00 | 2017-08-15 16:00:00 |
| 2 | comedy | cce8465 | 3 | 2017-08-25 00:00:00 | 2017-08-25 19:00:00 |
在Spring查询中,我得到了如下所示的当前事件:
private String getEventIdFromEventDay(String eventTypeId) {
String eventId = "";
SqlRowSet resultSet = null;
try {
resultSet = jdbcTemplate.queryForRowSet(
"select * from event_schedule where event_date >= CURDATE() and event_type_id=? order by event_date limit 1;",
new Object[] { eventTypeId });
if (resultSet != null && resultSet.next()) {
eventId = resultSet.getString("event_id");
}
}
}
catch (Exception e) {
logger.error("Exception om getEventIdFromEventDay: " + e);
}
return eventId;
}
所以,情况是:
我想知道是否有更好的问题来问我想做什么.
试过这个:
select * from event_schedule where CONVERT_TZ(event_date,'+00:00','-07:00') >= CONVERT_TZ(CURDATE(),'+00:00','-07:00') and CONVERT_TZ(TIMESTAMP(event_date, '23:59:59'),'+00:00','-07:00') <= CONVERT_TZ(TIMESTAMP(CURDATE(), '23:59:59'),'+00:00','-07:00') and event_type_id = "2";
收益如下:
Empty set (0.00 sec)
有人知道我怎么解决这个问题吗?
阅读了Basil的建议后编辑了
在我的文件中使用ThreeTen-Backport库,并尝试如下:
// Get current time in UTC
Instant now = Instant.now();
// Get time zone in PST
ZoneId pstTimeZone = ZoneId.of("America/Los_Angeles");
// Adjust into that time zone from UTC, producing a ZonedDateTime object.
ZonedDateTime adjustedZDTimeZoneFromUtc =now.atZone(pstTimeZone);
// Extract Date Only Value
LocalDate localDate = adjustedZDTimeZoneFromUtc.toLocalDate();
// Determine the first moment of the following day for that timezone
ZonedDateTime zdt = localDate.plusDays(1).atStartOfDay(pstTimeZone);
// Adjust back to UTC from that Time Zone
Instant firstMomentOfTomorrow = zdt.toInstant();
System.out.println("\n\n\t\tFirst moment of tomorrow: " + firstMomentOfTomorrow + "\n\n");
这是输出:
First moment of tomorrow: 2017-10-25T07:00:00Z
因此,当尝试在原始SQL调用中使用明天日期的第一分钟时(以便在将其放入Java代码中之前对其进行测试):
SELECT * FROM event_schedule WHERE event_date >= now() AND event_date <= "2017-10-25T07:00:00Z";
它产生:
Empty set, 1 warning (0.00 sec)
像这样尝试了Basil的查询:
SELECT * FROM event_schedule WHERE when >= now() AND when < "2017-10-25T07:00:00Z";
收益如下:
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'when >= now() AND when < "2017-10-25T07:00:00Z"' at line 1
问题:
first_moment_of_tomorrow
的列,并在事件表中进行日期范围检查?select now()
与curdate()
的问题是,现在用实际秒返回实际日期,而event_date则采用如下格式:
2017-08-15 00:00:00
因此,当尝试curdate时:
select curdate();
产生这样的结果:
+------------+
| curdate() |
+------------+
| 2017-10-24 |
+------------+
1 row in set (0.01 sec)
现在()尝试时:
select now();
产生这样的结果:
+---------------------+
| now() |
+---------------------+
| 2017-10-24 18:27:37 |
+---------------------+
1 row in set (0.00 sec)
有谁知道问题是什么吗?我需要对event_schedule.event_date
执行某种类型的SQL查询,但现在有点困惑.:(
发布于 2017-10-29 20:23:44
通过将时区加载到MySQL 5中并将查询更改为:
select * from event_schedule where event_id=? and bye_week=0 and date(convert_tz(event_date_time,'UTC','US/Pacific'))=date(convert_tz(now(), @@system_time_zone, 'US/Pacific'))
https://stackoverflow.com/questions/46920148
复制相似问题