Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP中MySQL日期字段中的可选月或日_Php_Mysql_Date - Fatal编程技术网

PHP中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

我有一个问题,我需要处理月份和日期部分是可选的日期。例如,年份总是已知的,但有时日期或月份和日期是未知的

在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 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"