如何在PHP的date()函数中同时使用两种日期格式?
解决方案
首先要明确你的duedate字段类型,分两种情况处理:
情况1:duedate是日期/时间类型(DATE、DATETIME等)
这种情况下完全不需要纠结前导零问题。MySQL的MONTH()、DAYOFMONTH()函数会直接从日期字段中提取数字形式的月、日,不管存储时的显示格式带不带前导零。你当前的代码已经可以正确匹配,无需修改——date('n')返回的无前导零月份(1-12)和MONTH(duedate)的结果是完全一致的,日期同理。
情况2:duedate是字符串类型(VARCHAR等),同时存储了带前导零和不带前导零的格式
如果字段是字符串,需要先把字符串转成日期类型再做判断,或者同时匹配两种格式。推荐用STR_TO_DATE统一转换,这样不管字符串是2024-05-01还是2024-5-1都能正确识别:
修改后的代码如下:
$month = date('n'); $day = date('j'); $year = date('Y'); $request = $DBFunc['db_query']('', ' SELECT COUNT(duedate) FROM {db_prefix}dulas WHERE is_did = {int:is_did} AND MONTH(STR_TO_DATE(duedate, "%Y-%c-%e")) = {int:month} AND DAYOFMONTH(STR_TO_DATE(duedate, "%Y-%c-%e")) = {int:day} AND YEAR(STR_TO_DATE(duedate, "%Y-%c-%e")) >= {int:year}', array( 'is_did' => 0, 'year' => $year, 'month' => $month, 'day' => $day, ) );
其中%c匹配无前导零的月份,%e匹配无前导零的日期,STR_TO_DATE会自动兼容带前导零的格式。
另外你之前尝试的date('n' || 'm')写法是错误的,date()函数仅接受单个格式字符串参数,不能通过逻辑或同时指定两种格式。
内容的提问来源于stack exchange,提问作者Athlant
相关产品推荐
相关产品推荐

