此问题已在此处有答案:
Extract hour and minute not working(2个答案)
3小时前关闭
我想从Oracle的日期列中获取小时部分。但是,并非所有行的日期列中都有小时信息。例如:
8/1/2008
8/2/2008
8/3/2008
8/2/2008 5:00:00 PM
8/2/2008 6:00:00 PM
8/2/2008 7:00:00 PM
命令:EXTRACT(HOUR FROM to_date(datetime, 'MM/DD/YYYY HH:MI:SS AM'))
返回错误消息:ORA-30075:提取源的提取字段无效。
我该怎么做呢?如果没有可用的小时信息,那么返回0。对于其他的,在上面的例子中,返回5,6和7。所以预期的结果是:
0
0
0
5
6
7
先谢谢你了。
3条答案
按热度按时间qqrboqgw1#
我们实际上是在谈论 columns,而不是 fields。
正如你所说的,从date字段中提取hour-我假设(我希望 * 正确 *)这是一个
date
数据类型列。如果是这样,这里有两个选项可以使用。样本表和数据:
表格内容:
等一下!那是什么 * 垃圾 *?小时和分钟在哪里?仍然存在,它只是 * 客户端 *,其默认格式以这种方式显示日期值。让我们修复它:
好的,这样好多了。它还表明,虽然你不一定要看到时间组件,但它仍然在这里,设置为 * 午夜 *。
我提到的两个选择:从timestamp中提取hour(因此转换为该数据类型),或者使用具有适当格式模型的
to_char
。fm
在这里只是为了删除前导零(即返回5
而不是05
):如果你将日期值存储到
varchar2
列中,那么--不要这样做。没有好处,只有问题。如果是这样的话,请说。j8yoct9x2#
看起来你的日期时间是VARCHAR 2,那么使用to_timestamp()而不是to_date(),当你使用'AM'时,小时必须在1和12之间,没有小时的日期转换为'dd/mm/yyyy 12:00:00 AM'或
to_number(to_char(to_date(datetime, 'MM/DD/YYYY HH:MI:SS AM'),'HH24'))
jpfvwuh43#
希望这对你有帮助
它的作用如下:
CASE语句检查datetime值是否包含空格字符,这表示它包含时间组件。
如果datetime值包含时间成分,TO_TIMESTAMP函数将使用“MM/DD/YYYY HH:MI:SS AM”格式掩码将字符串转换为时间戳数据类型。
然后,TO_CHAR函数将时间戳值转换为具有'HH 12'格式掩码的字符串,该字符串以12小时格式返回小时值,如果小时值小于10,则前导零。
SUBSTR函数提取TO_CHAR返回的字符串的最后两个字符,该字符串是12小时格式的小时值,不带前导零。
最后,TO_NUMBER函数将字符串值转换为数字。
如果datetime值没有时间组件,CASE语句将返回0作为hour_value。