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
|
||||
*/
|
||||
public function date($values) {
|
||||
return 'datetime null';
|
||||
return 'date null';
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1221,7 +1221,6 @@ class MSSQLDatabase extends SS_Database {
|
||||
$text = 'DELETE ';
|
||||
} else {
|
||||
$distinct = $query->getDistinct() ? 'DISTINCT ' : '';
|
||||
|
||||
// If there's a limit but no offset, just use 'TOP X'
|
||||
// rather than the more complex sub-select method
|
||||
if ($limit != 0 && $offset == 0) {
|
||||
@ -1775,7 +1774,20 @@ class MSSQLQuery extends SS_Query {
|
||||
if(!is_resource($this->handle)) return false;
|
||||
|
||||
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;
|
||||
}
|
||||
} 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