WP自定义字段日期格式比较

时间:2011-01-27 作者:idontknowhow

如何使用此代码使用日期格式Y-n-j

价值

start_date = 2011-1-20
end_date   = 2011-1-30
下面是源于此的原始函数Query between two meta values?

function date_check_join( $join ) {
    global $wpdb;
    $join .= " JOIN ".$wpdb->postmeta." AS startdate ON 
        (".$wpdb->posts.".ID = startdate.post_id AND
        startdate.meta_key = \'start_date\')
        JOIN ".$wpdb->postmeta." AS enddate ON 
        (".$wpdb->posts.".ID = enddate.post_id AND
        enddate.meta_key = \'end_date\')";
    return $join;
    }

function date_check_where( $where ) {
    $today = date(\'Y-n-j\'); /* I change this format to date(\'Y-n-j\')*/
    $where .= " AND startdate.meta_value <= $today
    AND enddate.meta_value >= $today";
    return $where;
    }
此函数正在使用UNIX TIME STAMP date(\'Ymd\') 当我更改日期格式时date(\'Y-n-j\')信贷@goldenapples

2 个回复
SO网友:MikeSchinkel

你好@idontknowhow:

您一直在努力解决PHP中的问题,而实际上您需要关注SQL。你的第一个问题是你颠倒了“极性”(这是我刚才编的一个术语,但有点合适);您要查找的开始日期大于今天,结束日期早于今天;逻辑上的不可能。

第二个问题是忽略反极性更为微妙;您将日期与等长字符串进行比较,以便得到误报。此SQL说明了问题:

SELECT * FROM wp_posts WHERE \'2011-9-20\' < \'2011-11-20\'
TheWHERE 条件“looks”true,因此查询应该返回所有记录,而实际上它不返回任何记录,这是因为\'2011-9\' < \'2011-1\' 实际上是假的。

这里有一个有效的替代品date_check_where() 使用SQL的函数DATE() 函数将日期中的字符串规范化为实际日期值,以便对其进行比较,它当然修复了我首先提到的极性问题:

add_filter( \'posts_where\', \'date_check_where\' );
function date_check_where( $where ) {
  $today = date(\'Y-m-d\');
  $where .=<<<SQL
 AND DATE(startdate.meta_value) >= DATE(\'{$today}\')
 AND DATE(enddate.meta_value) <= DATE(\'{$today}\')
SQL;
  return $where;
}
我使用的注释date(\'Y-m-d\') 而不是date(\'Y-n-j\') 因为我发现它使用起来更干净,而且由于DATE() 作用

SO网友:Rarst

尝试将用于比较的值放在引号中,这些缺点可能会将其解释为数学表达式,而不是字符串:

$where .= " AND \'startdate.meta_value\' <= \'$today\'
    AND \'enddate.meta_value\' >= \'$today\'";

结束

相关推荐