【问题标题】:How to search profiles in database by creation date如何按创建日期在数据库中搜索配置文件
【发布时间】:2019-06-14 16:59:51
【问题描述】:

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

实现这一点的最佳方法是什么?我考虑过添加新列(日、月、年)并按它们搜索,但我不知道这是否是正确的方法。搜索不应该很慢,日期需要本地化。

编辑:

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

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

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

【问题讨论】:

标签: java mysql sql hibernate


【解决方案1】:

将查询写成:

SELECT p.*
FROM profile p
WHERE p.creation_date >= 2019-01-21' AND
      p.creation_date < 2019-01-22' ;

profile(creation_date) 上添加索引,查询应该是快速且可扩展的(即不会随着行数的增加而明显减慢)。

【讨论】:

    【解决方案2】:

    试试这个

    Declare @startdate date ='1/1/2019'
    Declare @Enddate date ='1/21/2019'
    
    Select * from tablename where cast(creationdate as date) between @startdate and @Enddate
    

    【讨论】:

      【解决方案3】:

      我曾考虑添加新列(日、月、年)并按它们进行搜索,但我不知道这是否正确。搜索不应该很慢,日期需要本地化。

      如果您使用在将配置文件插入数据库后触发的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 是配置文件的时区。

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

      这是你要找的吗?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-18
        • 2012-03-02
        • 2016-07-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-13
        相关资源
        最近更新 更多