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语句的一部分。但我无法理解这个日期计算究竟发生了什么,有人可以解释一下吗?
答案 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
函数正在做的事情。
然后将这些日期(同一周的星期一和下一周的星期日)格式化为特定形式(三个字母的月份和两位数的日期,例如Jan14
或May18
)并连接起来CONCAT
使用分隔连字符。结果是别名week_dates
。
结果集中还有另一列给出了别名weekdays
;这保留了应用于international_date
的{{3}}函数的值(即一年中的一周)。