我目前将WordPress高级自定义字段日期存储在我的数据库中作为时间戳,但由于新插件的要求,我现在必须将它们存储为YYYYMMDD格式。
我有一个chronjob设置为每晚运行,为我的网站上的每周活动增加一周(604800),其中' event_date'小于当前的UNIX_TIMESTAMP。这将重新发布下周的活动。
我假设我需要将YYYYMMDD格式转换为时间戳,添加604800然后将其转换回来但真的不确定如何去做(SQL不是我的强项!)
当前SQL我必须将604800添加到每个帖子的时间戳,类别ID为29(每周),并将1209600添加到类别ID为19(每两周一次)如下...
以下代码已更新并正在运作!
UPDATE wp_postmeta rh INNER JOIN ( SELECT ID, wt.term_id FROM wp_terms wt INNER JOIN wp_term_taxonomy wtt ON wt.term_id = wtt.term_id INNER JOIN wp_term_relationships wpr ON wpr.term_taxonomy_id = wtt.term_taxonomy_id INNER JOIN wp_posts ON ID = wpr.object_id WHERE taxonomy = 'category' AND (wt.term_id=32) AND post_type = 'post' ) t ON rh.post_id = t.ID SET rh.meta_value = CASE WHEN t.term_id = 32 THEN DATE_FORMAT(STR_TO_DATE(rh.meta_value, '%Y%m%d') + INTERVAL 1 WEEK, '%Y%m%d') ELSE rh.meta_value END WHERE rh.meta_key = 'event_date' AND rh.meta_value < UNIX_TIMESTAMP();
是否有人能够建议为这些现在以YYYYMMDD格式存储的事件添加一周(或两周)的最佳方式?
这需要存储在PHP脚本中,这样我就可以设置一个chronjob来每晚自动执行和更新。
提前致谢, 标记
答案 0 :(得分:0)
使用PHP,它非常简单,从数据库中选择行,循环,然后更新:
<?php
$date = new DateTime('2014-09-18 00:00:00'); // populate with row value!
$date->modify('+1 week');
echo $date->format('Ymd');
将输出20140925
。然后更新你的行。在此处查看https://3v4l.org/5e8fg
另外,请查看DateTime::createFromFormat()
http://php.net/manual/en/datetime.createfromformat.php以不同的格式实例化DateTime。
答案 1 :(得分:0)
如果您将列存储作为varchar,则可以使用date_add和str_to_date
select DATE_ADD(str_to_date(your_column, '%Y%m%d'),INTERVAL 1 WEEK)
from my_table
答案 2 :(得分:0)
如果您有类似20170901
的内容,并且想要为其添加一周,请在SQL中尝试此操作。
DATE_FORMAT(STR_TO_DATE(date_text_col, '%Y%m%d') + INTERVAL 1 WEEK, '%Y%m%d')
这会将您的文字转换为DATETIME
。然后它会添加一周。然后它会将其转换回文本。
这应该适用于任何texty数据类型(CLOB,VARCHAR,CHAR)。
该日期计算的结果应直接放入列中,而不是添加到列中。像这样的表达应该这样做。
SET rh.meta_value = CASE
WHEN t.term_id = 32
THEN DATE_FORMAT(STR_TO_DATE(rh.meta_value, '%Y%m%d') + INTERVAL 1 WEEK, '%Y%m%d')
ELSE rh.meta_value END
如果您执行rh.meta_value = rh.meta_value + (some date)
,则将日期添加到自身,就好像它是一个数字一样,这没有任何意义。
wp_postmeta
的布局与MySQL自动将文本强制转换为数字相结合,可能会让这种事情变得非常混乱。
答案 3 :(得分:0)
这主要是评论 - 但它有点长。
但是由于新插件的要求,我现在必须将它们存储为YYYYMMDD格式。
鉴于它们在日期属性类型中存储为YYYMMDD,我猜你真的意味着你认为你需要使用整数或字符数据类型。在哪种情况下...... OMG,WTF?
正如您已经发现的那样,这使得维护数据很多更难
您现有要更新的数据意味着系统中的其他内容正在使用此属性 - 您确定其他所有使用此属性的内容都已停用吗?
在检查Wordpress site时,我发现故障实际上是在Wordpress中使用了一个非常讨厌的EAV表设计。虽然我不希望设计师期望数据以这个插件/你的应用程序的方式使用。
如果数据格式正确(并且比当前添加秒的方法更正确),DBMS可以进行数学运算,因此您只需要将存储的数据转换为日期,然后转换回来进行写入: / p>
UPDATE wp_postmeta rh
INNER JOIN (....) t ON rh.post_id = t.ID
SET rh.meta_value = DATE_FORMAT(
STR_TO_DATE(rh.meta_value, '%Y%m%d') + INTERVAL
CASE WHEN t.term_id = 29 THEN 7 DAY
WHEN t.term_id = 19 THEN 14 DAY
END, '%Y%m%d')