我们说我有这个日期,例如:
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
保存在表格列中。怎么样?
答案 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...)");