在IBM informix DB中将字符更改为时间戳

时间:2015-09-17 08:46:03

标签: sql informix

我正在编写一个将字符转换为日期时间的查询

以下查询以字符格式提取我的时间戳。

select
(to_char(TO_CHAR(MDY(month(current- 1 units month), 1,year(current- 1 units month)),'%Y-%m-%d')||' 13:00:00')),
(to_char(TO_CHAR((DATE(DATE(extend(TODAY, YEAR TO MONTH)) - 1 UNITS DAY)+1),'%d-%m-%Y')||' 13:00:00'))
from dual

输出:

`T 0÷ 
2015-08-01 13:00:00     01-09-2015 13:00:00
2015-08-01 13:00:00     01-09-2015 13:00:00

现在我正在尝试使用DATETIME(2001-12-31 15:32:55)YEAR TO SECOND功能将角色转换为时间戳。我收到语法错误。

select
DATETIME(to_char(TO_CHAR(MDY(month(current- 1 units month), 1,year(current- 1 units month)),'%Y-%m-%d')||' 13:00:00')) YEAR TO SECOND ,
DATETIME(to_char(TO_CHAR((DATE(DATE(extend(TODAY, YEAR TO MONTH)) - 1 UNITS DAY)+1),'%d-%m-%Y')||' 13:00:00') ) YEAR TO SECOND
from dual

以下哪项工作正常:

select DATETIME(2001-12-31 15:32:55) YEAR TO SECOND
from dual

先谢谢。请不要建议Oracle的答案。它在甲骨文中很容易。

1 个答案:

答案 0 :(得分:0)

尝试使用CAST将输出转换为DATETIME YEAR TO SECOND

select
(to_char(TO_CHAR(MDY(month(current- 1 units month), 1,year(current- 1 units month)),'%Y-%m-%d')||' 13:00:00'))::DATETIME YEAR TO SECOND ,
(to_char(TO_CHAR((DATE(DATE(extend(TODAY, YEAR TO MONTH)) - 1 UNITS DAY)+1),'%Y-%m-%d')||' 13:00:00'))::DATETIME YEAR TO SECOND
from dual

这似乎工作正常,但我建议你不要这样做。另请注意,DATETIME是ISO标准:YYYY-MM-DD HH:MM:SS.FFF(或其中的一部分)。第二个以英文格式显示日期的示例不会解析为DATETIME

你的第一个算法不是闰天安全,第二个例子非常复杂。您可以使用更简单的结构确定当月第一天的13:00:

(TODAY-DAY(TODAY)+1)::DATETIME YEAR TO SECOND + INTERVAL(13) HOUR TO HOUR

这也有助于避免在DATECHAR之间来回转换。上个月同一时间的计算可以写成:

MDY(MONTH(TODAY-DAY(TODAY)),1,YEAR(TODAY-DAY(TODAY)))::DATETIME YEAR TO SECOND + INTERVAL(13) HOUR TO HOUR

...这将在2月29日/ 3月1日的闰年做正确的事情,你的算法不会。

构造TODAY-DAY(TODAY)将始终生成上个月的最后一天。