0
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 语句的一部分。但是我不明白这个日期计算到底发生了什么,有人可以解释一下吗?

4

1 回答 1

1

理解这样的代码的关键是从向外工作。快速浏览您的代码会发现最里面的函数调用是相同的:

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

这两个函数调用的最里面,STR_TO_DATE,将字符串输入并通过根据第二个参数中给出的格式(即美国风格的月-日-年)对其进行解析products_options_values,将其转换为 MySQL值。最外层的函数调用 ,获取结果值并将其格式化为其第二个参数(即year-month-day)给出的形式。DATEDATE_FORMATDATE

也就是说,这些调用一起将以美国样式形式表示的日期转换为更国际化的格式。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函数正在做的事情。

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

结果集中还有另一列被赋予别名weekdays;this 保存了WEEK应用于international_date(即一年中的一周)的函数的值。

于 2012-05-14T08:20:24.180 回答