mirror of
https://github.com/silverstripe/silverstripe-mssql
synced 2024-10-22 08:05:53 +02:00
FEATURE: added datetime helper functions
This commit is contained in:
parent
27975ad20f
commit
9c1bda45ff
@ -1361,6 +1361,131 @@ class MSSQLDatabase extends SS_Database {
|
||||
public function endTransaction(){
|
||||
//Transactions not set up for MSSQL yet
|
||||
}
|
||||
|
||||
/**
|
||||
* Function to return an SQL datetime expression that can be used with SQLite3
|
||||
* used for querying a datetime in a certain format
|
||||
* @param string $date to be formated, can be either 'now', literal datetime like '1973-10-14 10:30:00' or field name, e.g. '"SiteTree"."Created"'
|
||||
* @param string $format to be used, supported specifiers:
|
||||
* %Y = Year (four digits)
|
||||
* %m = Month (01..12)
|
||||
* %d = Day (01..31)
|
||||
* %H = Hour (00..23)
|
||||
* %i = Minutes (00..59)
|
||||
* %s = Seconds (00..59)
|
||||
* %U = unix timestamp, can only be used on it's own
|
||||
* @return string SQL datetime expression to query for a formatted datetime
|
||||
*/
|
||||
function formattedDatetimeClause($date, $format) {
|
||||
|
||||
preg_match_all('/%(.)/', $format, $matches);
|
||||
foreach($matches[1] as $match) if(array_search($match, array('Y','m','d','H','i','s','U')) === false) user_error('formattedDatetimeClause(): unsupported format character %' . $match, E_USER_WARNING);
|
||||
|
||||
if(preg_match('/^now$/i', $date)) {
|
||||
$date = "CURRENT_TIMESTAMP";
|
||||
} else if(preg_match('/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/i', $date)) {
|
||||
$date = "'$date'";
|
||||
}
|
||||
|
||||
if($format == '%U') return "DATEDIFF(s, '19700101', $date)";
|
||||
|
||||
$trans = array(
|
||||
'Y' => 'yy',
|
||||
'm' => 'mm',
|
||||
'd' => 'dd',
|
||||
'H' => 'hh',
|
||||
'i' => 'mi',
|
||||
's' => 'ss',
|
||||
);
|
||||
|
||||
$strings = array();
|
||||
$buffer = $format;
|
||||
while(strlen($buffer)) {
|
||||
if(substr($buffer,0,1) == '%') {
|
||||
$f = substr($buffer,1,1);
|
||||
$flen = $f == 'Y' ? 4 : 2;
|
||||
$strings[] = "RIGHT('0' + CAST(DATEPART({$trans[$f]},$date) AS VARCHAR), $flen)";
|
||||
$buffer = substr($buffer, 2);
|
||||
} else {
|
||||
$pos = strpos($buffer, '%');
|
||||
if($pos === false) {
|
||||
$strings[] = $buffer;
|
||||
$buffer = '';
|
||||
} else {
|
||||
$strings[] = "'".substr($buffer, 0, $pos)."'";
|
||||
$buffer = substr($buffer, $pos);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return '(' . implode(' + ', $strings) . ')';
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Function to return an SQL datetime expression that can be used with SQLite3
|
||||
* used for querying a datetime addition
|
||||
* @param string $date, can be either 'now', literal datetime like '1973-10-14 10:30:00' or field name, e.g. '"SiteTree"."Created"'
|
||||
* @param string $interval to be added, use the format [sign][integer] [qualifier], e.g. -1 Day, +15 minutes, +1 YEAR
|
||||
* supported qualifiers:
|
||||
* - years
|
||||
* - months
|
||||
* - days
|
||||
* - hours
|
||||
* - minutes
|
||||
* - seconds
|
||||
* This includes the singular forms as well
|
||||
* @return string SQL datetime expression to query for a datetime (YYYY-MM-DD hh:mm:ss) which is the result of the addition
|
||||
*/
|
||||
function datetimeIntervalClause($date, $interval) {
|
||||
|
||||
$trans = array(
|
||||
'year' => 'yy',
|
||||
'month' => 'mm',
|
||||
'day' => 'dd',
|
||||
'hour' => 'hh',
|
||||
'minute' => 'mi',
|
||||
'second' => 'ss',
|
||||
);
|
||||
|
||||
$singularinterval = preg_replace('/(year|month|day|hour|minute|second)s/i', '$1', $interval);
|
||||
|
||||
if(
|
||||
!($params = preg_match('/([-+]\d+) (\w+)/i', $singularinterval, $matches)) ||
|
||||
!isset($trans[strtolower($matches[2])])
|
||||
) user_error('datetimeIntervalClause(): invalid interval ' . $interval, E_USER_WARNING);
|
||||
|
||||
if(preg_match('/^now$/i', $date)) {
|
||||
$date = "CURRENT_TIMESTAMP";
|
||||
} else if(preg_match('/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/i', $date)) {
|
||||
$date = "'$date'";
|
||||
}
|
||||
return "LEFT(CONVERT(VARCHAR, DATEADD(" . $trans[strtolower($matches[2])] . ", " . (int)$matches[1] . ", $date), 121), 19)";
|
||||
}
|
||||
|
||||
/**
|
||||
* Function to return an SQL datetime expression that can be used with SQLite3
|
||||
* used for querying a datetime substraction
|
||||
* @param string $date1, can be either 'now', literal datetime like '1973-10-14 10:30:00' or field name, e.g. '"SiteTree"."Created"'
|
||||
* @param string $date2 to be substracted of $date1, can be either 'now', literal datetime like '1973-10-14 10:30:00' or field name, e.g. '"SiteTree"."Created"'
|
||||
* @return string SQL datetime expression to query for the interval between $date1 and $date2 in seconds which is the result of the substraction
|
||||
*/
|
||||
function datetimeDifferenceClause($date1, $date2) {
|
||||
|
||||
if(preg_match('/^now$/i', $date1)) {
|
||||
$date1 = "CURRENT_TIMESTAMP";
|
||||
} else if(preg_match('/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/i', $date1)) {
|
||||
$date1 = "'$date1'";
|
||||
}
|
||||
|
||||
if(preg_match('/^now$/i', $date2)) {
|
||||
$date2 = "CURRENT_TIMESTAMP";
|
||||
} else if(preg_match('/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/i', $date2)) {
|
||||
$date2 = "'$date2'";
|
||||
}
|
||||
|
||||
return "DATEDIFF(s, $date2, $date1)";
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
Loading…
Reference in New Issue
Block a user