2017-09-07 30 views
1

我目前將WordPress高級自定義字段日期存儲在我的數據庫中作爲時間戳,但由於來自新插件的要求,我現在必須將它們存儲爲YYYYMMDD格式。將一週添加到以YYYMMDD格式存儲的SQL值

我有一個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

event_date數據類型是一個varchar? – scaisEdge

+0

event_date的meta_key的meta_value存儲爲longtext –

+0

是的,這是'wp_postmeta'鍵/值存儲的典型問題。這些值都是文本。 –

回答

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的文本自動強制轉換爲數字可以使這種事情非常混亂。

+0

感謝您的回覆。 我已經去修改上面的SQL查詢來合併你的代碼,但不知道我是否正確地執行了它。它已更新值'event_date',但不會在一週內添加......它將其從20170906更改爲40341819! 'SET rh.meta_value = 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' )END' (我已將term_id(類別)更改爲32,並給出了我的某個帖子的類別,因此它只會更新那個用於測試) –

+0

請參閱我的編輯。 '40341819'是'20170906' +'20170913'。 –

+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來實例化不同格式的日期時間。

+0

感謝您的回覆。我需要能夠更新存儲在數據庫中的值,而不是隻在前端顯示+ 1周的值 –

+0

是的,很好地取出行,操作DateTime,而不是回顯它,使用'$ date-> 'UPDATE'語句中的format()' – delboy1978uk

0

如果你有一個列存儲爲varchar,你可以使用DATE_ADD和STR_TO_DATE

select DATE_ADD(str_to_date(your_column, '%Y%m%d'),INTERVAL 1 WEEK) 
from my_table 
+0

event_date的meta_key的meta_value存儲爲長文本。這仍然有效嗎? –

+0

@ O.Jones謝謝..正確。回答更新.. – scaisEdge

0

這主要是一個評論 - 但它有點長。

但由於新插件的要求,我現在必須將它們存儲爲YYYYMMDD格式。

鑑於它們以日期屬性類型的形式存儲爲YYYMMDD,我猜你確實是說你認爲你需要使用整數或字符數據類型。在這種情況下...... OMG,WTF?

  1. 因爲你已經發現了,這使得維護數據的很多困難

    你有現有數據更新
  2. 意味着別的東西在你的系統是利用這個屬性的 - 是你確定使用這個屬性的其他東西正在退役嗎?

在檢查Wordpress site,我看到故障實際上是​​在WordPress的它採用了真討厭EAV表的設計。儘管我不希望設計者期望數據以這種插件/你的應用程序的方式使用。

如果數據的格式正確(並且比當前添加秒的方法更正確),那麼DBMS可以進行數學計算,因此您只需將存儲的數據轉換爲日期,然後轉換回來進行寫入:

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') 
+0

看起來很有希望,但沒有效果,但不能太遠!我更新了原始代碼以合併您的建議(刪除了每兩週一次的部分以嘗試簡化一下,並將類別ID更改爲32,因此它不會影響我的所有帖子)。我會繼續擺弄,但如果你能看到任何明顯的東西,任何建議都會比歡迎。 –

相關問題