草庐IT

php - 来自 PHP 的 MySQL 日期字段中的可选月份或日期

coder 2023-10-24 原文

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

在 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;
}

所以它模式匹配输入 $phpDate,它必须以 4 位数字开头,然后是月份和日期的可选数字对。这些存储在名为 $parts 的数组中。

然后检查月或日是否存在,指定格式字符串并创建日期。

最后,如果一切正常,它会返回一个有效日期和一个格式字符串。否则返回 FALSE。

我最终得到了我的数据库的有效日期格式,并且我有办法在它恢复时再次使用它。

有人想出更好的方法吗?

最佳答案

I have a problem where I need to handle dates where the month and day parts are optional. For example, the year will always be known but sometimes the day or month and day will be unknown.

在很多情况下,我们确实需要这样“或多或少精确”的日期,我使用诸如 2011-04-01(精确)和 2011-04 这样的日期(= 2011 年 4 月)和 2011(仅限年份的日期)在文件元数据中。正如您所提到的,MySQL 日期字段可以容忍“2011-00-00”,但没有常见问题解答说明,这很好。
但是,我必须通过 ODBC 和日期字段连接 MySQL 数据库 已正确翻译,但“容忍”日期除外(例如:“2011-04-00”在生成的 MySQL-ODBC 连接的 ACCESS 数据库中结果为空。
出于这个原因,我得出结论,MySQL 日期字段可以转换为普通 VARCHAR(10) 字段:只要我们不需要特定的 MySQL 日期函数,它就可以正常工作,当然,我们仍然可以使用 php 日期函数和您的 date_php2mysql() 函数。

我会说唯一需要 MySQL 日期字段的情况 是当需要复杂的 SQL 查询时,在查询本身中使用 MySQL 日期函数。 (但是这样的查询将不再适用于“或多或少精确”的日期!...)

结论:对于“或多或少精确”的日期, 我目前丢弃 MySQL 日期字段并使用普通 VARCHAR(10) 字段 使用 aaaa-mm-jj 格式的数据。简单就是美。

关于php - 来自 PHP 的 MySQL 日期字段中的可选月份或日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4952086/

有关php - 来自 PHP 的 MySQL 日期字段中的可选月份或日期的更多相关文章

  1. ruby-on-rails - 如何验证非模型(甚至非对象)字段 - 2

    我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss

  2. ruby-on-rails - form_for 中不在模型中的自定义字段 - 2

    我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢

  3. ruby-on-rails - date_field_tag,如何设置默认日期? [ rails 上的 ruby ] - 2

    我想设置一个默认日期,例如实际日期,我该如何设置?还有如何在组合框中设置默认值顺便问一下,date_field_tag和date_field之间有什么区别? 最佳答案 试试这个:将默认日期作为第二个参数传递。youcorrectlysetthedefaultvalueofcomboboxasshowninyourquestion. 关于ruby-on-rails-date_field_tag,如何设置默认日期?[rails上的ruby],我们在StackOverflow上找到一个类似的问

  4. ruby-on-rails - 在 Rails 和 ActiveRecord 中查询时忽略某些字段 - 2

    我知道我可以指定某些字段来使用pluck查询数据库。ids=Item.where('due_at但是我想知道,是否有一种方法可以指定我想避免从数据库查询的某些字段。某种反拔?posts=Post.where(published:true).do_not_lookup(:enormous_field) 最佳答案 Model#attribute_names应该返回列/属性数组。您可以排除其中一些并传递给pluck或select方法。像这样:posts=Post.where(published:true).select(Post.attr

  5. ruby-on-rails - Ruby 检查日期时间是否为 iso8601 并保存 - 2

    我需要检查DateTime是否采用有效的ISO8601格式。喜欢:#iso8601?我检查了ruby​​是否有特定方法,但没有找到。目前我正在使用date.iso8601==date来检查这个。有什么好的方法吗?编辑解释我的环境,并改变问题的范围。因此,我的项目将使用jsapiFullCalendar,这就是我需要iso8601字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让ActiveRecord完成它们的工作并在我需要时间信息时对其进行操作。 最佳答案 我不太明白你的问题。我假设您想检查

  6. ruby - 检查日期是否在过去 7 天内 - 2

    我的日期格式如下:"%d-%m-%Y"(例如,今天的日期为07-09-2015),我想看看是不是在过去的七天内。谁能推荐一种方法? 最佳答案 你可以这样做:require"date"Date.today-7 关于ruby-检查日期是否在过去7天内,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/32438063/

  7. ruby-on-rails - 将 Ruby 中的日期/时间格式化为 YYYY-MM-DD HH :MM:SS - 2

    这个问题在这里已经有了答案:Railsformattingdate(4个答案)关闭4年前。我想格式化Time.Now函数以显示YYYY-MM-DDHH:MM:SS而不是:“2018-03-0909:47:19+0000”该函数需要放在时间中.现在功能。require‘roo’require‘roo-xls’require‘byebug’file_name=ARGV.first||“Template.xlsx”excel_file=Roo::Spreadsheet.open(“./#{file_name}“,extension::xlsx)xml=Nokogiri::XML::Build

  8. ruby - 查找字符串中的内容类型(数字、日期、时间、字符串等) - 2

    我正在尝试解析一个CSV文件并使用SQL命令自动为其创建一个表。CSV中的第一行给出了列标题。但我需要推断每个列的类型。Ruby中是否有任何函数可以找到每个字段中内容的类型。例如,CSV行:"12012","Test","1233.22","12:21:22","10/10/2009"应该产生像这样的类型['integer','string','float','time','date']谢谢! 最佳答案 require'time'defto_something(str)if(num=Integer(str)rescueFloat(s

  9. ruby-on-rails - ruby 日期方程不返回预期的真值 - 2

    为什么以下不同?Time.now.end_of_day==Time.now.end_of_day-0.days#falseTime.now.end_of_day.to_s==Time.now.end_of_day-0.days.to_s#true 最佳答案 因为纳秒数不同:ruby-1.9.2-p180:014>(Time.now.end_of_day-0.days).nsec=>999999000ruby-1.9.2-p180:015>Time.now.end_of_day.nsec=>999999998

  10. ruby-on-rails - 事件管理员日期过滤器日期格式自定义 - 2

    是否有简单的方法来更改默认ISO格式(yyyy-mm-dd)的ActiveAdmin日期过滤器显示格式? 最佳答案 您可以像这样为日期选择器提供额外的选项,而不是覆盖js:=f.input:my_date,as::datepicker,datepicker_options:{dateFormat:"mm/dd/yy"} 关于ruby-on-rails-事件管理员日期过滤器日期格式自定义,我们在StackOverflow上找到一个类似的问题: https://s

随机推荐