【问题标题】:Modifying date to enable search in mysql DateTime format修改日期以启用 mysql DateTime 格式的搜索
【发布时间】:2013-05-23 20:47:57
【问题描述】:

我有一个 UI,我们在其中选择一个日期范围,然后执行查询以检查该范围内的订单。

所以接受的有效格式是

a) 2013-04-01 17:00:00 - 2013-04-16 18:00:00

b) 2013-04-01 17:00:00 - 2013-04-16

c) 2013-04-01 - 2013-04-16

我将它拆分为 ruby​​ 以提供 start_date 和 end_date。我不必触摸开始时间,因为它已为 sql 查询做好了准备。

但是必须修改 end_date,因为要执行范围查询 created_at BETWEEN '2013-04-01 17:00:00' AND '2013-04-16' 不会给我应该包含在结果集中的 16 日的结果。 (与 2013-04-16 00:00:00 相比)

所以这是可行的解决方案,我想出了

end_date = Time.parse(end_date).strftime("%T")=="00:00:00" ? (end_date.to_s) + " 23:59:59" : end_date.to_s

是否有更好的方法来做到这一点,因为上面看起来很混乱? (看还是1-2行答案,不多)

【问题讨论】:

    标签: sql ruby-on-rails ruby date time


    【解决方案1】:

    您可以使用DateTime.parse(str) 方法:

    date_str = "2013-04-16"
    date = DateTime.parse(date_str)
    #=> Tue, 16 Apr 2013 00:00:00 +0000
    
    date_time_str = "2013-04-16 18:00:00"
    date = DateTime.parse(date_time_str)
    #=> Tue, 16 Apr 2013 18:00:00 +0000
    

    然后您可以测试.hour(或.minute)并将end_date 设置为end_of_day(如果没有选择时间):

    end_date = (date.hour == 0 && date.minute == 0) ? date.end_of_day : date
    

    小改进:您可以测试解析的日期是否等于该日期的开始(没有小时/分钟/秒):

    date = DateTime.parse("2013-12-12")
    #=> Thu, 12 Dec 2013 00:00:00 +0000
    date.beginning_of_day
    #=> Thu, 12 Dec 2013 00:00:00 +0000
    end_date = (date.beginning_of_day == date) ? date.end_of_day : date
    #=> Thu, 12 Dec 2013 23:59:59 +0000
    

    解决问题当用户输入像2013-04-16 00:00:00这样的日期时间时,您可以使用.include?检查字符串是否包含'00:00:00'部分:

    date_str = "2013-04-16 00:00:00"
    date = DateTime.parse(date_str)
    
    end_date = date if date_str.include?('00:00:00') # means the user explicitly wants the time at 00:00 and 00 second
    end_date ||= (date.beginning_of_day == date) ? date.end_of_day : date # set end_date if end_date.nil?
    

    【讨论】:

    • 看起来好多了,而且易于阅读。现在在 irb 中尝试一下。
    • 适用于 irb.. 看不出为什么它不应该在 rails 应用程序中工作。
    • Yoshji 先生,这么着急吗? :-)
    • 啊,是的,对不起,我想通过 5 400 代表... x)
    • 如果那家伙进入了, date_time_str = "2013-04-16 00:00:00" ,那么即使那个会被转换成 2013-04-16 23:59:59?
    猜你喜欢
    • 2013-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-08
    • 2014-02-23
    • 1970-01-01
    • 2012-08-01
    • 1970-01-01
    相关资源
    最近更新 更多