我在数据库中有带有创建日期列(DATETIME)的配置文件。我需要在Java中按日期实现搜索配置文件,它将返回在特定日期或月份创建的所有配置文件。
实现此目标的最佳方法是什么?我曾考虑过要添加新列(日,月,年)并按它们进行搜索,但我不知道这是否是正确的方法。搜索不应该太慢,并且日期必须本地化。
编辑:
是的,此查询(来自另一个问题)有效:
SELECT * FROM profile WHERE DATE(creation_date) = '20190121';
我在这里看到的一个问题是,在有大量配置文件的情况下,此查询可能会很慢,因为必须首先执行Date函数,然后才对所有创建日期进行比较。在我看来,这种解决方案效率不高。我不确定添加更多的列(天,月和年为整数)是否是更好的解决方案,或者使用索引。
答案 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' ;
上添加索引,查询应该快速且可扩展(即,随着行数的增加,速度不会明显降低)。