如何在仅使用PHP的oracle原始日期中添加一个月?

时间:2014-12-20 02:23:05

标签: php oracle

我们说我有这个日期,例如:

12-DEC-14 11.55.51.000000000 AM

然后我将其分配给变量,让我们说:

$date = '12-DEC-14 11.55.51.000000000 AM';

现在问题是,如何仅使用$date添加1个月或2个月左右 php,没有使用任何oracle sql日期函数,只是纯php, 因为我会以相同的格式将结果保存到oracle db table。

结果应该是,例如:

$nextmonth = '12-JAN-15 11.55.51000000000 AM';

然后我可以将$nextmonth保存在表格列中。怎么样?

2 个答案:

答案 0 :(得分:1)

在这种情况下,您可以使用DateTime类,加载该日期并定义其格式。然后在创建datetime对象后,将其调整为x个月,然后再以原始格式再次显示。

$input = '12-DEC-14 11.55.51.000000000 AM';
$date = DateTime::createFromFormat('d-M-y h.i.s A', $input);
$next_month = clone $date;
$next_month->modify('+1 month');
echo strtoupper($next_month->format('d-M-y h.i.s A'));

答案 1 :(得分:0)

这可能只是一个很长的评论而不是一个真正的答案,但是你的一些评论让我觉得我们在XY problem有一个实例:

  

它是一个TIMESTAMP(6),但格式与第12-DEC-14栏中的格式完全相同11.55.51.000000000 AM

     

接下来的9个零怎么回事?如果我只是追加它就像回复strtoupper($ next_month->格式('d-M-y h.i.s.0000000000 A'))那样会不会导致oracle中出现任何错误;

TIMESTAMP(6)存储日期时间信息(“时间点”)。它没有任何“格式”标准。 TIMESTAMP是一种很棒的数据类型,因为它们可以让您在数据库级别轻松执行数据和时间计算,例如“添加一个月”

但是,如果没有您的部分明确请求,则使用默认格式时间戳转换为字符串 EM>

或许你的真正问题是Oracle尝试使用隐式字符串转换为时间戳 >标准格式。通常,自己明确转换数据类型是一个好主意。来自the documentation

  

Oracle建议您指定显式转换,而不是依赖隐式或自动转换,原因如下:

     
      
  • [...]
  •   
  • 隐式转换取决于它发生的上下文,并且在每种情况下都可能无法以相同的方式工作。例如,从datetime值到VARCHAR2值的隐式转换可能会返回意外的年份,具体取决于NLS_DATE_FORMAT参数的值。
  •   

请注意,上述陈述也适用于TIMESTAMP,因为“标准”格式可由用户NLS_TIMESTAMP_FORMAT定义。

PHP documentation有类似的警告:

  

DATE列作为格式化为当前日期格式的字符串返回。可以使用Oracle环境变量(如NLS_LANG)或先前执行的ALTER SESSION SET NLS_DATE_FORMAT命令更改默认格式。

作为个人建议,我会说你永远不要依赖隐式日期/时间戳转换,因为在DB级或当前会话中相关配置设置的任何更改都会破坏你的代码。


因此,根据您插入值的方式,使用显式格式可能就像将绑定变量包装在正确的TO_TIMESTAMP(....)调用中一样简单:

// query the original data
$q = oci_parse ($connection ,
                "INSERT INTO ....
                        VALUES (TO_TIMESTAMP(:date_as_str, 'YYYY-MM-DD HH:MI:SS.FF'), other_columns...)");


$q = oci_parse ($connection ,
                "INSERT INTO ....
                        VALUES (TO_TIMESTAMP(:date_as_str, 'YYYY-MM-DD HH:MI:SS.FF'), other_columns...)");

回到您的初始问题:“如何在原始日期添加一个月” “我将以相同的格式将结果保存到oracle db表数据类型“,这应该像插入值时添加1个月一样简单:

$q = oci_parse ($connection ,
                "INSERT INTO ....
                        VALUES (TO_TIMESTAMP(:date_as_str, 'YYYY-MM-DD HH:MI:SS.FF')
                                + INTERVAL '1' MONTH, other_columns...)");