Задать вопрос
@maks280795

Как транслировать формат даты PHP в формат MySql, PGSql?

Доброе утро, товарищи.

Помогите пожалуйста решить вопрос, у самого в голове только какие-то велосипеды трансляторы рисуются.

Работаю с Yii2, дорабатываю менеджер отчетов, из основных требований необходима поддержка MySql и PGSql.

Задача:
Имеется поле в базе данных, типа DATETIME/DATE/TIMESTAMP(нам неизвестно, конструктор отчетов не привязан к какой-либо конкретной таблице, максимум в конфиге можно описать будет).
Необходимо используя формат в стиле date или strftime сделать выборку из базы данных.
Делается это для того, чтобы динамически вычисляемые поля можно было потом использовать при группировке данных.
Сейчас приведение даты к нужному формату делается на стороне PHP, а унификация всех возможных типов данных путем выборки TIMESTAMP'а из БД.

Вроде всё, do you have ideas?

-----------------------

UPD В кратце, необходимо получить дату в определенном формате и при этом поддерживать MySql и PGSql.
  • Вопрос задан
  • 895 просмотров
Подписаться 2 Оценить Комментировать
Решения вопроса 1
@maks280795 Автор вопроса
Не стал особо замарачиваться, готовое не нашел, в результате такой вот велосипед с квадратными колесами:
<?php

	$config = [
		// Day [01-31]
		'd' => [
			'mysql' => '%d',
			'pgsql' => 'DD',
		],
		// Weekday name 3 chars [from Mon to Sun]
		'D' => [
			'mysql' => '%a',
			'pgsql' => 'Dy',
		],
		// Full weekday name [from Sunday to Saturday]
		'l' => [
			'mysql' => '%W',
			'pgsql' => 'Day',
		],
		// Day of year [001..366](PgSql && MySql)
		'z' => [
			'mysql' => '%j',
			'pgsql' => 'DDD',
		],
		// Week of year (01..53)
		'W' => [
			'mysql' => '%v',
			'pgsql' => 'IW',
		],
		// Month, numeric [01..12]
		'm' => [
			'mysql' => '%m',
			'pgsql' => 'MM',
		],
		// Abbreviated month name [Jan..Dec]
		'M' => [
			'mysql' => '%b',
			'pgsql' => 'Mon',
		],
		// Year, numeric, four digits
		'Y' => [
			'mysql' => '%Y',
			'pgsql' => 'YYYY',
		],
		// Year, numeric, two digits
		'y' => [
			'mysql' => '%y',
			'pgsql' => 'YY',
		],
		// Month name [January..December]
		'F' => [
			'mysql' => '%M',
			'pgsql' => 'Month',
		],
	];

	$datetime = '20160101000001';
	$originalFormat = 'd D l z W m M Y y F';

	$elements = str_split($originalFormat);
	$mySqlFormat = '';
	$pgSqlFormat = '';
	foreach($elements as $element) {
		if(array_key_exists($element, $config)) {
			$m = $config[$element]['mysql'];
			$p = $config[$element]['pgsql'];
		}
		$mySqlFormat .= ($m) ? $m : $element;
		$pgSqlFormat .= ($p) ? $p : $element;
		unset($m, $p);
	}

	echo "Original format is: {$originalFormat}\n";
	echo "MySQL format is: {$mySqlFormat}\n";
	echo "PgSQL format is: {$pgSqlFormat}\n";
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
edli007
@edli007
full stack, team lead
Ну для начала можно использовать DATETIME вместо TIMESTAMP, а там и по месяцам выборки и вообще как хочешь, темболее что в пхп также есть весьма удобный SPL DateTime.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы