PHP Mysql PDO retrieve records by date range - mysql

I'm retrieving a list of items from my database using the PDO approach and when I do:
$select['from'] = date('Y-m-d 00:00:00',strtotime("2016-02-01"));
$sql = "SELECT * FROM listings WHERE date_added >= :date AND date_added < DATE_ADD(:date, INTERVAL 30 DAY)";
$statement = $pdo->prepare($sql);
$statement->bindParam(":date", $select['from'], PDO::PARAM_STR);
$statement->execute();
var_dump of my result gives:
object(stdClass)#5 (2) { ["data"]=> array(0) { } ["rows"]=> int(0) }
Running the same query directly through PhpMyAdmin gives the desired result. date_added is data type DATETIME

This can be a problem of your date format.
You have to use the format 'Y-m-d H:i:s' in PHP.
$date = date('Y-m-d H:i:s', strtotime($yourdate));

Related

MySQL query with DATE_FORMAT() to Laravel Querybuilder (or Eloquent)

I'm trying to get records from a table on a specific day.
Dates's format: datetime (YYYY-MM-DD HH:II:SS)
I'm trying to translate a MySQL query to Laravel query builder. But I don't know how to deal with the DATE_FORMAT().
Here is MySQL query
SELECT * FROM events
JOIN customers ON events.id_customer = customers.id
WHERE start_date > DATE_FORMAT("2017-06-15", "%Y-%m-%d %H:%i:%s")
AND end_date < DATE_FORMAT("2017-06-16", "%Y-%m-%d %H:%i:%s")
;
In my controller I get a date (string) that I put into a DateTime
$date_datetime = new \DateTime(Input::get('date_string'));
And then change its format
$query_date = date_format($date_datetime, 'Y-m-d H:i:s');
I've tried the following code, but it is obviously not working
$pdf_events = DB::table('events')
->join('customers', 'events.id_customer', '=', 'customers.id')
->select(...)
->whereRaw("start_date > DATE_FORMAT($query_date, '%Y-%m-%d %H:%i:%s')")
->whereRaw("end_date < DATE_FORMAT($query_date, '%Y-%m-%d %H:%i:%s')+1")
->get();
I strongly recommend using Carbon for handling DateTime in Laravel since it has support out of the box.
Now, how to use it to resolve your problem?
First, you need to convert your input into Carbon object.
$start_date = Carbon::parse(Input::get('date_string'));
// Assuming you want the end date 1 day later at same time
$end_date = $start_date->addDay();
// You could change the format with format() but in this case we don't need to
Then in your Eloquent, you can use the Carbon Datetime object to query using where()
$pdf_events = DB::table('events')
->join('customers', 'events.id_customer', '=', 'customers.id')
->select(...)
->where("start_date", ">", $start_date)
->where("end_date", "<", $end_date)
->get();
You can pass Carbon (doc) objects to compare dates. For example:
->where('start_date', '=', Carbon::now())
You can build a custom Carbon object for a custom date-time to pass into the where clause.
You don't need DATE_FORMAT, Try this:
$query_start_date = \Carbon\Carbon::createFromFormat("Y-m-d H:i:s", request()->date_string);
// Add 1 day to the date
$query_end_date = $query_start_date->addDay();
$pdf_events = DB::table('events')
->join('customers', 'events.id_customer', '=', 'customers.id')
->where(
[
["start_date", ">", $query_start_date],
["end_date", "<", $query_end_date]
]
)->get();
use Datetime;
$end_date1 = $request->input('end_date');
$EndDateTime = DateTime::createFromFormat('d/m/Y H:i:s', $end_date1);
$end_date = $EndDateTime->format('Y-m-d H:i:s');
try like this its work for me

Can't set parameter for raw SQL in Doctrince

I am using raw SQL in doctrine.
my SQL:
//input datetime type for $dateStart,$dateEnd
$start = date_format( $dateStart,'Y-m-d');
$end = date_format( $dateEnd,'Y-m-d');
$sql = '
SELECT
*
FROM
log
WHERE
time >= "? 00:00:00"
AND
time <= "? 23:59:59"
';
$pdo = $this->em->getConnection();
$stmt = $pdo->prepare($sql);
$stmt->bindValue(1,$start);
$stmt->bindValue(2,$end);
$stmt->execute();
$rs = $stmt->fetchAll();
I tried bindValue, bindParam but no hope. I've also tried $param as array to pass to execute and it did not work.
$param = array($start,$end);
Could anyone help me?.
You cannot bind a part of a string literal, but a complete literal only
Besides, it makes no sense to split your date creation between PHP and SQL
$start = date_format( $dateStart,'Y-m-d 00:00:00');
$end = date_format( $dateEnd,'Y-m-d 23:59:59');
$pdo = $this->em->getConnection();
$stmt = $pdo->prepare('SELECT * FROM log WHERE time BETWEEN ? AND ?');
$stmt->execute([$start, $end]);
$rs = $stmt->fetchAll();

How to select a date less than the current one?

I want to load the appointment history of my customer from db, each record have the start_datetime and end_datetime, actually my query looks like this:
$query = $this->db
->select('*')
->from('appointments')
->where('id', 5) 'id of record to select
->where('start_datetime' ) 'here's indecision
->get()->result_array();
essentially the record to load should be all record previoulsly of current datetime. How I can pass this condition in the where clause?
Try this
$now = date('Y-m-d H:i:s'); # get current time stamp
$query = $this->db
->select('*')
->from('appointments')
->where('id', 5)
->where(start_datetime <= $now ) # Sometimes date($now)
->get()->result_array();

Make Zend\Db (zf2) between clause inclusive

I'm currently using Zend Framework 2 and a query with date ranges to obtain data out of a MySQL DB, and I came across the between clause that was previously not available in ZF1.
However, my code which looks something like this is not working correctly:
$dateStart = '2012-12-20';
$dateEnd = '2012-12-31';
$sql = new Sql($_db);
$select = $sql->select()
->from(array("t" => $table))
->columns(array("col1" => "col_as_1", "col2" => "col_as_2"));
$select->where->between("date", $dateStart, $dateEnd);
$stmt = $sql->prepareStatementForSqlObject($select);
$result = $stmt->execute()->getResource()->fetchAll(\PDO::FETCH_ASSOC);
Apparently the between clause is not inclusive, I can only get results until 2012-12-30, is there a way to make it inclusive? I've been taking a look at the ZF2 docs but they are not very helpful and running the same query on MySQL query browser returns all of the data I need.
So you can try lessThanOrEqualTo and greaterThanOrEqualTo.
Between doesn't seem to provide this functionality: between($identifier, $minValue, $maxValue)
If you trace out your query with $select->__toString() you can see the query as string.
I don't have ZF2 on my computer but I could imagine that between in ZF2 will output date > '2012-12-20' AND date < '2012-12-31'.
NOTE THIS : WHEN USING between on Mysql
date_column_name between 'startDate' AND 'endDate'
NOTE : you should want to insert +1 date to endDate . Because of when you insert 2015-05-18 date to endDate.you can not get data of 2015-05-18.So you need to plus one date to endDate.
You can do it using this
$plusToDate = date('Y-m-d H:i:s', strtotime($toDate . ' + 1 day'));
The BETWEEN should be inclusive, are you sure there are no hours, minutes and seconds after the date, that would cause it not to select dates on 2012-12-31 since 2012-12-31 00:00:01 would technically be > 2012-12-31
Format must be same, use mysql DATE function
$select->where->between("DATE(date)", DATE('.$dateStart.'), DATE('.$dateEnd.'));
$from_date = date('Y-m-d', strtotime($AppCleaner->from_date ));
$to_date = date('Y-m-d', strtotime($AppCleaner->to_date ));
$select->where->between('appointment_date', $from_date . ' 00:00:00', $to_date . ' 23:59:59');
also, Use the between clause as below:
$sql = new Sql($this->adapter);
$select = $sql->select();
$select->from('app_posts');
$select->where->NEST->between( 'id', 30,40);
$select->group('app_posts.id');
// echo $select->getSqlString($this->adapter->getPlatform());
// exit;
$statement = $sql->prepareStatementForSqlObject($select);
$result = $statement->execute();
$resultSet = new ResultSet();
$resultSet->initialize($result);
$posts = $resultSet->buffer()->toArray();
return $resultSet;
Try this:
//I have a static function to make conversion Data Format
public static function convertBrazilianDate2MySQLDatabase($dataBrazil) {
$array = explode("/", $dataBrazil);
$array = array_reverse($array);
$str = implode($array, "/");
return date("Y-m-d", strtotime($str));
}
//In My Service I built my sentence
$dtStart = \Estrutura\Helpers\Data::convertBrazilianDate2MySQLDatabase($dt_start) . ' 00:00:01';
$dtEnd = \Estrutura\Helpers\Data::convertBrazilianDate2MySQLDatabase($dt_end) . ' 23:59:59';
$select->where->between('field name in table', $dtStart, $dtEnd);
[...]

xml unix timestamp to mysql timestamp and record mysql

My XML:
<simpletype type="TURKEY">
<city code="01">
<telcode>(0 322)</telcode>
<name>Adana</name>
<time>1345337940</time>
</city>
<city code="02">
<telcode>(0 416)</telcode>
<name>Adıyaman</name>
<time>1340236800</time>
</city>
</simpletype>
MY Mysql import Code:
require_once('db.php');
#mysql_connect(_SERVER,_USER,_PASSWORD);
#mysql_select_db(_DATABASE);
$doc = new DOMDocument();
$doc->load( 'CityCode.xml' );
$cities = $doc->getElementsByTagName( "city" );
foreach( $cities as $city )
{
$names = $city->getElementsByTagName( "name" );
$codes = $city->getElementsByTagName( "telcode" );
$times = $city->getElementsByTagName ( "time");
$name = $names->item(0)->nodeValue;
$code = $codes->item(0)->nodeValue;
$time = $times->item(0)->nodeValue;
mysql_query("SET CHARACTER SET utf8");
$sql = "INSERT INTO telcode (sehir, name, time) VALUES ('$name' ,'$code' ,'UNIX_TIMESTAMP ($time') ";
#mysql_query($sql);
}
My Question:
My xml source have a unix timestamp and i must use is mysql timeststamp (0000-00-00 00:00:00)
How can i convert $time unix timestamp to mysql timestamp and record mysql db ?
In MySQL you can convert a UNIX-style timestamp (seconds since 1970 UTC) to a MySQL timestamp with the FROM_UNIXTIME function.
See here. http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html#function_from-unixtime
In php, you can read a timestamp out into whatever format you like.
date($format, $timestamp);
http://php.net/manual/en/function.date.php