有人可以向我解释一下这个mysql选择查询值的逻辑吗?

时间:2012-05-14 07:29:12

标签: mysql

Concat(Date_format(Date_add(Date_format(Str_to_date(
                                               products_options_values,
                                               '%m-%d-%Y'
                                                      ),
                                                      '%Y-%m-%d'),
                                             INTERVAL(2-Dayofweek(Date_format(
                                             Str_to_date(
                                             products_options_values, '%m-%d-%Y'
                                             )
                                             , '%Y-%m-%d')))day), '%b%d'), '-',
       Date_format(Date_add(Date_format(Str_to_date(products_options_values,
                                        '%m-%d-%Y'
       )
       ,
       '%Y-%m-%d'
       ),
       INTERVAL( 8 - Dayofweek( Date_format(Str_to_date(products_options_values,
       '%m-%d-%Y'
       ), '%Y-%m-%d')) )day), '%b%d'))
       AS week_dates,
       Week(Date_format(Str_to_date(products_options_values, '%m-%d-%Y'),
            '%Y-%m-%d'))
                   AS weekdays

我需要在jquery中实现上面的mysql日期计算逻辑。 这是获取日期的mysql select语句的一部分。但我无法理解这个日期计算究竟发生了什么,有人可以解释一下吗?

1 个答案:

答案 0 :(得分:1)

理解这样的代码的关键是从内部向外工作。快速浏览一下代码会快速显示最里面的函数调用是相同的:

DATE_FORMAT(STR_TO_DATE(products_options_values, '%m-%d-%Y'), '%Y-%m-%d')

这两个函数调用中最内部的STR_TO_DATE接受products_options_values中的字符串,并通过根据第二个参数中给出的格式对其进行解析将其转换为MySQL DATE值(即美式月 - 日 - )。最外面的函数调用DATE_FORMAT获取生成的DATE值,并以第二个参数(即 year-month-day )。

也就是说,这些调用一起将以美式格式表示的日期转换为更国际化的格式。使用international_date代替这些调用重写您的查询的其余部分:

Concat(
  Date_format(
    Date_add(
      international_date,
      INTERVAL(
        2 - Dayofweek(international_date)
     ) day
   ),
   '%b%d'
  ),
  '-',
  Date_format(
    Date_add(
      international_date,
      INTERVAL(
        8 - Dayofweek(international_date)
      ) day
    ),
    '%b%d'
  )
) AS week_dates,
Week(international_date) AS weekdays

DAYOFWEEK函数将给定日期的星期几作为1到7之间的整数返回(其中1表示星期日,7表示星期六)。因此,添加2 - DAYOFWEEK(international_date)天会给出同一周的星期一;并且添加8 - DAYOFWEEK(international_date)将给出下周的星期日。这正是DATE_ADD函数正在做的事情。

然后将这些日期(同一周的星期一和下一周的星期日)格式化为特定形式(三个字母的月份和两位数的日期,例如Jan14May18)并连接起来CONCAT使用分隔连字符。结果是别名week_dates

结果集中还有另一列给出了别名weekdays;这保留了应用于international_date的{​​{3}}函数的值(即一年中的一周)。