mirror of
https://github.com/silverstripe/silverstripe-mssql
synced 2024-10-22 08:05:53 +02:00
BUGFIX Fixing date/datetime handling in MSSQLDatabase
Fixing the date type to actually be "date", and not "datetime" so that values are returned as "Y-m-d" for dates, and not "Y-m-d H:i:s". Additionally, fixing a case where using the mssql functions would return strange datetime formats. We need the datetime field values in Y-m-d H:i:s. To get this working, we need to inspect the field type when retrieving rows from the database and re-format the datetime value at this point. This is done in MSSQLQuery::nextRecord()
This commit is contained in:
parent
49625242c1
commit
a4c269bf62
@ -983,7 +983,7 @@ class MSSQLDatabase extends SS_Database {
|
|||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
public function date($values) {
|
public function date($values) {
|
||||||
return 'datetime null';
|
return 'date null';
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -1221,7 +1221,6 @@ class MSSQLDatabase extends SS_Database {
|
|||||||
$text = 'DELETE ';
|
$text = 'DELETE ';
|
||||||
} else {
|
} else {
|
||||||
$distinct = $query->getDistinct() ? 'DISTINCT ' : '';
|
$distinct = $query->getDistinct() ? 'DISTINCT ' : '';
|
||||||
|
|
||||||
// If there's a limit but no offset, just use 'TOP X'
|
// If there's a limit but no offset, just use 'TOP X'
|
||||||
// rather than the more complex sub-select method
|
// rather than the more complex sub-select method
|
||||||
if ($limit != 0 && $offset == 0) {
|
if ($limit != 0 && $offset == 0) {
|
||||||
@ -1775,7 +1774,20 @@ class MSSQLQuery extends SS_Query {
|
|||||||
if(!is_resource($this->handle)) return false;
|
if(!is_resource($this->handle)) return false;
|
||||||
|
|
||||||
if($this->mssql) {
|
if($this->mssql) {
|
||||||
if($data = mssql_fetch_assoc($this->handle)) {
|
if($row = mssql_fetch_row($this->handle)) {
|
||||||
|
foreach($row as $i => $value) {
|
||||||
|
$field = mssql_fetch_field($this->handle, $i);
|
||||||
|
|
||||||
|
// fix datetime formatting from format "Jan 1 2012 12:00:00:000AM" to "2012-01-01 12:00:00"
|
||||||
|
// strtotime doesn't understand this format, so we need to do some modification of the value first
|
||||||
|
if($field->type == 'datetime' && $value) {
|
||||||
|
$value = date('Y-m-d H:i:s', strtotime(preg_replace('/:[0-9][0-9][0-9]([ap]m)$/i', ' \\1', $value)));
|
||||||
|
}
|
||||||
|
|
||||||
|
if(isset($value) || !isset($data[$field->name])) {
|
||||||
|
$data[$field->name] = $value;
|
||||||
|
}
|
||||||
|
}
|
||||||
return $data;
|
return $data;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
28
tests/MSSQLDatabaseQueryTest.php
Normal file
28
tests/MSSQLDatabaseQueryTest.php
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
<?php
|
||||||
|
class MSSQLDatabaseQueryTest extends SapphireTest {
|
||||||
|
|
||||||
|
public static $fixture_file = 'MSSQLDatabaseQueryTest.yml';
|
||||||
|
|
||||||
|
protected $extraDataObjects = array(
|
||||||
|
'MSSQLDatabaseQueryTestDataObject'
|
||||||
|
);
|
||||||
|
|
||||||
|
public function testDateValueFormatting() {
|
||||||
|
$obj = $this->objFromFixture('MSSQLDatabaseQueryTestDataObject', 'test-data-1');
|
||||||
|
$this->assertEquals('2012-01-01', $obj->TestDate, 'Date field value is formatted correctly (Y-m-d)');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testDatetimeValueFormatting() {
|
||||||
|
$obj = $this->objFromFixture('MSSQLDatabaseQueryTestDataObject', 'test-data-1');
|
||||||
|
$this->assertEquals('2012-01-01 10:30:00', $obj->TestDatetime, 'Datetime field value is formatted correctly (Y-m-d H:i:s)');
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
class MSSQLDatabaseQueryTestDataObject extends DataObject implements TestOnly {
|
||||||
|
|
||||||
|
public static $db = array(
|
||||||
|
'TestDate' => 'Date',
|
||||||
|
'TestDatetime' => 'SS_Datetime'
|
||||||
|
);
|
||||||
|
|
||||||
|
}
|
5
tests/MSSQLDatabaseQueryTest.yml
Normal file
5
tests/MSSQLDatabaseQueryTest.yml
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
MSSQLDatabaseQueryTestDataObject:
|
||||||
|
test-data-1:
|
||||||
|
TestDate: 2012-01-01
|
||||||
|
TestDatetime: 2012-01-01 10:30:00
|
||||||
|
|
Loading…
Reference in New Issue
Block a user