从Oracle中归档的日期中提取小时数[重复]

tjjdgumg  于 2023-04-11  发布在  Oracle
关注(0)|答案(3)|浏览(172)

此问题已在此处有答案

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

先谢谢你了。

qqrboqgw

qqrboqgw1#

我们实际上是在谈论 columns,而不是 fields
正如你所说的,从date字段中提取hour-我假设(我希望 * 正确 *)这是一个date数据类型列。如果是这样,这里有两个选项可以使用。
样本表和数据:

SQL> create table test (date_col date);

Table created.

SQL> insert into test
  2  select date '2008-08-01' from dual union all
  3  select date '2008-08-02' from dual union all
  4  select date '2008-08-03' from dual union all
  5  select to_date('08-02-2008 05:00', 'mm-dd-yyyy hh24:mi') from dual union all
  6  select to_date('08-02-2008 06:00', 'mm-dd-yyyy hh24:mi') from dual union all
  7  select to_date('08-02-2008 07:00', 'mm-dd-yyyy hh24:mi') from dual;

6 rows created.

表格内容:

SQL> select * from test;

DATE_COL
---------
01-AUG-08
02-AUG-08
03-AUG-08
02-AUG-08
02-AUG-08
02-AUG-08

6 rows selected.

等一下!那是什么 * 垃圾 *?小时和分钟在哪里?仍然存在,它只是 * 客户端 *,其默认格式以这种方式显示日期值。让我们修复它:

SQL> alter session set nls_date_format = 'dd.mm.yyyy hh24:mi:ss';

Session altered.

SQL> select * from test;

DATE_COL
-------------------
01.08.2008 00:00:00
02.08.2008 00:00:00
03.08.2008 00:00:00
02.08.2008 05:00:00
02.08.2008 06:00:00
02.08.2008 07:00:00

6 rows selected.

好的,这样好多了。它还表明,虽然你不一定要看到时间组件,但它仍然在这里,设置为 * 午夜 *。
我提到的两个选择:从timestamp中提取hour(因此转换为该数据类型),或者使用具有适当格式模型的to_charfm在这里只是为了删除前导零(即返回5而不是05):

SQL> select date_col,
  2         extract(hour from cast (date_col as timestamp)) result_1,
  3         to_char(date_col, 'fmhh24') result_2
  4  from test;

DATE_COL              RESULT_1 RE
------------------- ---------- --
01.08.2008 00:00:00          0 0
02.08.2008 00:00:00          0 0
03.08.2008 00:00:00          0 0
02.08.2008 05:00:00          5 5
02.08.2008 06:00:00          6 6
02.08.2008 07:00:00          7 7

6 rows selected.

SQL>

如果你将日期值存储到varchar2列中,那么--不要这样做。没有好处,只有问题。如果是这样的话,请说。

j8yoct9x

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'))

jpfvwuh4

jpfvwuh43#

希望这对你有帮助

SELECT 
  CASE
    WHEN datetime LIKE '% %' 
    THEN TO_NUMBER(SUBSTR(TO_CHAR(TO_TIMESTAMP(datetime, 'MM/DD/YYYY HH:MI:SS AM'), 'HH12'), -2))
    ELSE 0
  END AS hour_value
FROM your_table;

它的作用如下:
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。

相关问题