【问题标题】:I need to select a specific range of dates, ignoring year, from MySQL table我需要从 MySQL 表中选择特定的日期范围,忽略年份
【发布时间】:2012-11-14 20:07:17
【问题描述】:

这是我的问题。我的系统以您通常的 DATETIME 格式存储日期和时间:

'YYYY-MM-DD HH:MM:SS'

这是我遇到的问题:

我需要选择所有具有此格式日期字段的联系人:

'XXXX-12-02 23:59:59' and every other date 7 days leading up to it.

例如,我需要获取所有这些行以及这些日期作为响应:

1965-12-02
1985-11-28
1990-12-01

这可能吗?如果可以,您可以给我任何帮助或提示吗?

【问题讨论】:

  • 请解释“以及在此之前的每隔 7 天”
  • 我认为他的意思是范围(DATE - 7 days --> DATE)
  • 是的,我的意思是:DATE

标签: mysql algorithm date range


【解决方案1】:

您可以使用以下函数获取DATETIME 变量的特定部分。

  • DAY(your_DATETIME_Variable) --> 以整数形式获取日期
  • MONTH(your_DATETIME_Variable) --> 获取月份为整数
  • YEAR(your_DATETIME_Variable) --> 获取年份为整数

【讨论】:

  • 这很容易,只要当月的天数 > 7,但是 OP 正在寻找的天数可能比“种子日期”还要再一个月甚至一年,然后事情就开始了用 SQL 做的有点乱……
  • 这是我同事的建议,但由于几个月(或几年)的变化,它并不完全有效。
【解决方案2】:

简单的部分:查找同一天和同一月的任何日期:

SELECT .... FROM .... WHERE 
   month(timefield)=month('2012-12-02 23:59:59') 
   and day(timefield) = day('2012-12-02 23:59:59)

一种混乱的做法,但它会(主要)工作是做一个

SELECT .... FROM .... WHERE 
   (month(timefield)=month('2012-12-02 23:59:59') 
   and day(timefield) = day('2012-12-02 23:59:59')) or
   (month(timefield)=month(date_sub('2012-12-02 23:59:59' interval 1)) 
   and day(timefield) = day(date_sub('2012-12-02 23:59:59') interval 1)) or
   (month(timefield)=month(date_sub('2012-12-02 23:59:59' interval 2)) 
   and day(timefield) = day(date_sub('2012-12-02 23:59:59') interval 2)) or

等等……

然后问题来了:闰年怎么办...我没有任何好的解决方案...如果您的种子日期是 2012 年 3 月 5 日,那么您只能回到 2 月 28 日-2012,但我想您希望数据回到 2011 年 2 月 27 日... 一种可能的解决方案是确保您始终将日期标准化为闰年,取回 8 天的日期并丢弃您所做的事情不想在前端。

【讨论】:

  • 由于某种原因无法正常工作。语法有问题,我不认为你可以这样写。
  • 想一想。 - 这是一个错误的方法......对不起。
  • 我现在有另一个想法,有点乱,但它可能会奏效 - 需要注意的是。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多