PHP中MySQL日期字段中的可选月或日
我有一个问题,我需要处理月份和日期部分是可选的日期。例如,年份总是已知的,但有时日期或月份和日期是未知的 在MySQL中,我可以创建一个带有日期字段的表,虽然在MySQL手册中找不到任何引用,但它将接受以下有效:PHP中MySQL日期字段中的可选月或日,php,mysql,date,Php,Mysql,Date,我有一个问题,我需要处理月份和日期部分是可选的日期。例如,年份总是已知的,但有时日期或月份和日期是未知的 在MySQL中,我可以创建一个带有日期字段的表,虽然在MySQL手册中找不到任何引用,但它将接受以下有效: (YYYY-MM-DD format): 2011-02-10 // Current date 2011-02-00 // Day unknown so replaced with 00 2011-00-00 // Day and month unkown so re
(YYYY-MM-DD format):
2011-02-10 // Current date
2011-02-00 // Day unknown so replaced with 00
2011-00-00 // Day and month unkown so replaced with 00-00
数据库中的测试计算工作正常,因此我仍然可以轻松地对结果进行排序。在手册中,它说月份必须在01和12之间,日期必须在01和31之间,但它接受00
第一个问题:我是否会在月或日使用00部件时遇到麻烦,或者这完全可以接受
下一个问题:是否有PHP函数(或MySQL格式命令)可以自动将以下日期格式化为所需的格式字符串
2011 becomes 2011-00-00
2011-02 becomes 2011-02-00
或者我需要写一个特殊的函数来处理这个问题
以下操作不起作用:
<?php
$date = date_create_from_format('Y-m-d', '2011-00-00');
echo date_format($date, 'Y-m-d');
// Returns 2010-11-30
$date = date_create_from_format('Y-m-d', '2011-02-00');
echo date_format($date, 'Y-m-d');
// Returns 2011-01-31
?>
第三个问题:是否有PHP函数(或MySQL命令)来格式化PHP中使用的日期
最后,这是最好的方法吗?还是有“最佳实践”方法
编辑: 以下是我目前正在做的事情: 日期字段可以接受格式为YYYY、YYYY-MM或YYYY-MM-DD的日期,在发送到数据库之前,它将在以下函数中处理:
/**
* Takes a date string in the form:
* YYYY or
* YYYY-MM or
* YYYY-MM-DD
* and validates it
*
* Use date_format($date, $format); to reverse.
*
* @param string $phpDate Date format [YYYY | YYYY-MM | YYYY-MM-DD]
*
* @return array 'date' as YYYY-MM-DD, 'format' as ['Y' | 'Y-m' | 'Y-m-d'] or returns false if invalid
*/
function date_php2mysql($phpDate) {
$dateArr = false;
// Pattern match
if (preg_match('%^(?P<year>\d{4})[- _/.]?(?P<month>\d{0,2})[- _/.]?(?P<day>\d{0,2})%im', trim($phpDate), $parts)) {
if (empty($parts['month'])) {
// Only year valid
$date = $parts['year']."-01-01";
$format = "Y";
} elseif (empty($parts['day'])) {
// Year and month valid
$date = $parts['year']."-".$parts['month']."-01";
$format = "Y-m";
} else {
// Year month and day valid
$date = $parts['year']."-".$parts['month']."-".$parts['day'];
$format = "Y-m-d";
}
// Double check that it is a valid date
if (strtotime($date)) {
// Valid date and format
$dateArr = array('date' => $date, 'format' => $format);
}
} else {
// Didn't match
// Maybe it is still a valid date
if (($timestamp = strtotime($phpDate)) !== false) {
$dateArr = array('date' => date('Y-m-d', $timestamp), 'format' => "Y-m-d");
}
}
// Return result
return $dateArr;
}
/**
*采用以下格式的日期字符串:
*YYYY或
*YYYY-MM或
*YYYY-MM-DD
*并验证了它
*
*使用date_格式($date,$format);倒过来。
*
*@param string$phpDate日期格式[YYYY | YYYY-MM | YYYY-MM-DD]
*
*@return数组'date'为YYYY-MM-DD,'format'为['Y'|'Y-m'|'Y-m-d'],如果无效,则返回false
*/
函数日期\u php2mysql($phpDate){
$dateArr=false;
//模式匹配
如果(preg_match('^(?P\d{4})[-\/]?(?P\d{0,2})[-\/]?(?P\d{0,2})%im',trim($phpDate),$parts)){
如果(空($parts['month'])){
//仅有效年份
$date=$parts['year']。“-01-01”;
$format=“Y”;
}elseif(空($parts['day'])){
//年月有效
$date=$parts['year'].“-”$parts['month'.“-01”;
$format=“Y-m”;
}否则{
//年月日有效
$date=$parts['year'].“-”$parts['month'.“-”$parts['day'];
$format=“Y-m-d”;
}
//再次检查该日期是否有效
if(标准时间($日期)){
//有效日期和格式
$dateArr=array('date'=>$date,'format'=>$format);
}
}否则{
//不匹配
//也许这仍然是一个有效的日期
if(($timestamp=strottime($phpDate))!==false){
$dateArr=array('date'=>date('Y-m-d',$timestamp),'format'=>Y-m-d”);
}
}
//返回结果
返回$dateArr;
}
因此,它的模式匹配输入$phpDate,其中必须以4位数字开头,然后可以选择月份和日期的数字对。它们存储在一个名为$parts的数组中
然后检查是否存在月份或天数,指定格式字符串并创建日期
最后,如果一切正常,它将返回一个有效的日期和一个格式字符串。否则返回FALSE
最后,我为我的数据库提供了一个有效的日期格式,当它返回时,我有办法再次使用它
有人想到更好的方法吗?因为数据部分都是可选的,所以将月、日和年的部分存储在单独的整数字段中会很乏味吗?还是在VARCHAR字段中?2011-02-00不是一个有效的日期,我不认为mysql或PHP会对此感到兴奋。使用str_to_time进行测试,看看您得到了什么样的结果,还有,您是否验证了排序在MySQL中工作正常?如果文档说需要1到31,并且需要00,那么您可能依赖于本质上的bug
由于2011-02-00不是一个有效的日期,PHP的格式化函数都不会给出这个结果。如果它能处理好的话,如果你能得到2001-01-31,我也不会感到惊讶。更有理由将其作为字符串存储在数据库中,或者将月、日和年放在单独的整数字段中。如果使用后一种方法,仍然可以对这些列进行排序。我也遇到了这个问题。我最后用的是梨枣包。大多数日期类不适用于可选月份或可选日期,但PEAR日期包适用。这也意味着您不需要自定义格式函数,可以使用日期包提供的奇特格式方法 我有一个问题,我需要处理月份和日期部分是可选的日期。 例如,年份总是已知的,但有时日期或月份和日期是未知的 不知道 在许多情况下,我们确实需要这种“或多或少精确”的日期,我在档案元数据中使用的日期包括
2011-04-01
(精确),以及2011-04
(=2011年4月)和2011
(仅限年份日期)。正如您所提到的,MySQL日期字段可以容忍“2011-00-00”,尽管没有常见问题解答,这很好。但是,我必须通过
ODBC
和日期字段来连接MySQL数据库
正确翻译,但结果MySQL ODBC connected ACCESS数据库中的“容忍”日期(例如:“2011-04-00”结果为空)除外。
因此,我得出结论,MySQL日期字段可以转换为普通的VARCHAR(10)
字段:只要我们不需要特定的MySQL日期函数,它就可以正常工作,当然,我们仍然可以使用php日期函数和您的精细日期\u php2mysql()函数
我想说的是,唯一需要MySQL日期字段的情况
当需要复杂的SQL查询时,请在查询本身中使用MySQL
date函数。
(但这种查询在“或多或少的prec”上不再有效
YEAR(dateField) as Year, MONTH(dateField) as Month, DAY(dateField) as DAY
$day = 0;
$month = 0;
$year = 2013;
echo $datestring;
$format = "Y";
if($month)
{
$format .= "-m";
if($day)
$format .="-d";
else
$day = 1;
}
else
{
$month = 1;
$day = 1;
}
$datestring = strval($year)."-".strval($month)."-".strval($day);
$date = date($format, strtotime($datestring));
echo $date; // "2013", if $month = 1, "2013-01", if $day and $month = 1, "2013-01-01"