我正在编写一个将字符转换为日期时间的查询
以下查询以字符格式提取我的时间戳。
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的答案。它在甲骨文中很容易。
答案 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
这也有助于避免在DATE
和CHAR
之间来回转换。上个月同一时间的计算可以写成:
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)
将始终生成上个月的最后一天。