如何按创建日期在数据库中搜索配置文件

时间:2019-01-21 10:13:04

标签: java mysql sql hibernate

我在数据库中有带有创建日期列(DATETIME)的配置文件。我需要在Java中按日期实现搜索配置文件,它将返回在特定日期或月份创建的所有配置文件。

实现此目标的最佳方法是什么?我曾考虑过要添加新列(日,月,年)并按它们进行搜索,但我不知道这是否是正确的方法。搜索不应该太慢,并且日期必须本地化。

编辑:

是的,此查询(来自另一个问题)有效:

SELECT * FROM profile WHERE DATE(creation_date) = '20190121';

我在这里看到的一个问题是,在有大量配置文件的情况下,此查询可能会很慢,因为必须首先执行Date函数,然后才对所有创建日期进行比较。在我看来,这种解决方案效率不高。我不确定添加更多的列(天,月和年为整数)是否是更好的解决方案,或者使用索引。

3 个答案:

答案 0 :(得分:0)

  

我考虑过要添加新列(天,月,年)并按它们进行搜索,但是我不知道这是否是正确的方法。搜索不应该太慢,并且日期必须本地化。

如果您使用在数据库中插入配置文件后触发的Datetime列,则将拥有所需的一切。您只需要一列timezone即可知道创建的配置文件的时区。

您可以执行以下操作:

// I have no idea how your column or table are named so here is an example
SELECT * FROM profile WHERE created_at = '?'

?表示用户要查找的日期。

现在是本地化部分,这里是文档:https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html#function_convert-tz

SELECT * FROM profile WHERE CONVERT_TZ(created_at, 'GMT', profile_timezone) = '?'

其中'GMT'是您的服务器时区(由真实的时区代替),而profile_timezone是配置文件的时区。

这样,当用户搜索配置文件时,您将根据在用户时区中创建配置文件的日期时间返回配置文件。

是您要找的东西吗?

答案 1 :(得分:0)

尝试

Declare @startdate date ='1/1/2019'
Declare @Enddate date ='1/21/2019'

Select * from tablename where cast(creationdate as date) between @startdate and @Enddate

答案 2 :(得分:0)

将查询写为:

$ git checkout b1

# revert the commits changes
$ git revert <from-commit-hash>..<to-commit-hash>

SELECT p.* FROM profile p WHERE p.creation_date >= 2019-01-21' AND p.creation_date < 2019-01-22' ; 上添加索引,查询应该快速且可扩展(即,随着行数的增加,速度不会明显降低)。