WP_Date_Query::build_time_query( string $column, string $compare, int|null $hour = null, int|null $minute = null, int|null $second = null ): string|false

Builds a query string for comparing time values (hour, minute, second).

Description

If just hour, minute, or second is set than a normal comparison will be done.
However if multiple values are passed, a pseudo-decimal time will be created in order to be able to accurately compare against.

Parameters

$columnstringrequired
The column to query against. Needs to be pre-validated!
$comparestringrequired
The comparison operator. Needs to be pre-validated!
$hourint|nulloptional
An hour value (0-23).

Default:null

$minuteint|nulloptional
A minute value (0-59).

Default:null

$secondint|nulloptional
A second value (0-59).

Default:null

Return

string|false A query part or false on failure.

Source

public function build_time_query( $column, $compare, $hour = null, $minute = null, $second = null ) {
	global $wpdb;

	// Have to have at least one.
	if ( ! isset( $hour ) && ! isset( $minute ) && ! isset( $second ) ) {
		return false;
	}

	// Complex combined queries aren't supported for multi-value queries.
	if ( in_array( $compare, array( 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN' ), true ) ) {
		$return = array();

		$value = $this->build_value( $compare, $hour );
		if ( false !== $value ) {
			$return[] = "HOUR( $column ) $compare $value";
		}

		$value = $this->build_value( $compare, $minute );
		if ( false !== $value ) {
			$return[] = "MINUTE( $column ) $compare $value";
		}

		$value = $this->build_value( $compare, $second );
		if ( false !== $value ) {
			$return[] = "SECOND( $column ) $compare $value";
		}

		return implode( ' AND ', $return );
	}

	// Cases where just one unit is set.
	if ( isset( $hour ) && ! isset( $minute ) && ! isset( $second ) ) {
		$value = $this->build_value( $compare, $hour );
		if ( false !== $value ) {
			return "HOUR( $column ) $compare $value";
		}
	} elseif ( ! isset( $hour ) && isset( $minute ) && ! isset( $second ) ) {
		$value = $this->build_value( $compare, $minute );
		if ( false !== $value ) {
			return "MINUTE( $column ) $compare $value";
		}
	} elseif ( ! isset( $hour ) && ! isset( $minute ) && isset( $second ) ) {
		$value = $this->build_value( $compare, $second );
		if ( false !== $value ) {
			return "SECOND( $column ) $compare $value";
		}
	}

	// Single units were already handled. Since hour & second isn't allowed, minute must to be set.
	if ( ! isset( $minute ) ) {
		return false;
	}

	$format = '';
	$time   = '';

	// Hour.
	if ( null !== $hour ) {
		$format .= '%H.';
		$time   .= sprintf( '%02d', $hour ) . '.';
	} else {
		$format .= '0.';
		$time   .= '0.';
	}

	// Minute.
	$format .= '%i';
	$time   .= sprintf( '%02d', $minute );

	if ( isset( $second ) ) {
		$format .= '%s';
		$time   .= sprintf( '%02d', $second );
	}

	return $wpdb->prepare( "DATE_FORMAT( $column, %s ) $compare %f", $format, $time );
}

Changelog

VersionDescription
3.7.0Introduced.

User Contributed Notes

You must log in before being able to contribute a note or feedback.