oracle转换日期 (to_date(to_char('2021-01-01 00:00:00','yyyy-mm-dd hh24:mi:ss'),'yyyy-mm-dd hh24:mi:ss') 为什么会报无效数字错误
时间: 2024-03-05 16:54:28 浏览: 16
在你提供的语句中,`to_char('2021-01-01 00:00:00','yyyy-mm-dd hh24:mi:ss')` 的作用是将日期类型的数据转换为字符串类型的数据,日期类型的数据格式是'yyyy-mm-dd hh24:mi:ss',转换后的字符串格式也是'yyyy-mm-dd hh24:mi:ss'。
然后,你使用 `to_date` 函数将转换后的字符串类型的数据再次转换为日期类型的数据,语句为:
```
to_date(to_char('2021-01-01 00:00:00','yyyy-mm-dd hh24:mi:ss'),'yyyy-mm-dd hh24:mi:ss')
```
这个语句会报错,原因是 `to_char` 函数返回的是字符串类型的数据,而 `to_date` 函数需要的是日期类型的数据。所以,在将字符串类型的日期转换为日期类型的过程中,需要指定正确的日期格式。因此,你可以将语句修改为:
```
to_date('2021-01-01 00:00:00','yyyy-mm-dd hh24:mi:ss')
```
这个语句可以将字符串类型的日期转换为日期类型的数据。
相关问题
数据库中,TimeStamp怎么转为yyyy-MM-dd HH:mm:ss格式
要将数据库中的TimeStamp类型转换为yyyy-MM-dd HH:mm:ss格式,可以使用数据库中的日期函数和格式化函数来实现。具体方法如下:
1. 对于MySQL数据库,可以使用DATE_FORMAT函数。例如:
```
SELECT DATE_FORMAT(TIMESTAMP_COLUMN, '%Y-%m-%d %H:%i:%s') FROM TABLE_NAME;
```
其中,TIMESTAMP_COLUMN是时间戳所在的列名,TABLE_NAME是表名。'%Y-%m-%d %H:%i:%s'是需要输出的格式。
2. 对于Oracle数据库,可以使用TO_CHAR函数。例如:
```
SELECT TO_CHAR(TIMESTAMP_COLUMN, 'yyyy-MM-dd HH24:MI:SS') FROM TABLE_NAME;
```
其中,TIMESTAMP_COLUMN是时间戳所在的列名,TABLE_NAME是表名。'yyyy-MM-dd HH24:MI:SS'是需要输出的格式。
3. 对于SQL Server数据库,可以使用CONVERT函数。例如:
```
SELECT CONVERT(VARCHAR(19), TIMESTAMP_COLUMN, 120) FROM TABLE_NAME;
```
其中,TIMESTAMP_COLUMN是时间戳所在的列名,TABLE_NAME是表名。120是需要输出的格式代码,表示'yyyy-MM-dd HH:mm:ss'。
以上是三种常见数据库中将TimeStamp类型转换为指定格式的方法,具体使用哪种方法取决于你所使用的数据库类型。
select * from ( /** 查询用户月结每天的明细信息 **/ SELECT TO_CHAR (f_hand_date, 'yyyy-MM-dd') AS f_hand_date, MIN (F_LAST_TABLEBASE) AS F_LAST_TABLEBASE, MAX (F_TABLEBASE) AS F_TABLEBASE, SUM (F_OUGHTAMOUNT) AS F_OUGHTAMOUNT, SUM (F_OUGHTFEE) AS F_OUGHTFEE FROM T_HANDPLAN WHERE f_userinfo_id = '10155142' --传f_userinfo_id AND F_HAND_DATE >= TO_DATE ( '2023-05-01 00:00:00', 'yyyy-mm-dd hh24:mi:ss' ) --传F_START_DATE AND F_HAND_DATE <= TO_DATE ( '2023-05-31 23:59:59', 'yyyy-mm-dd hh24:mi:ss' ) --传F_END_DATE GROUP BY TO_CHAR (f_hand_date, 'yyyy-MM-dd') ) where rownum <= :1故障
这个SQL查询语句中的最后一行存在问题,因为Oracle数据库中的rownum是伪列,它的值是在查询结果返回之后才会进行计算,所以在查询语句中直接使用rownum是没有意义的。将该查询结果再次进行筛选,需要使用子查询或者其他方法。
如果想要查询前N条记录,可以使用如下SQL语句:
```
SELECT * FROM (
SELECT TO_CHAR (f_hand_date, 'yyyy-MM-dd') AS f_hand_date, MIN (F_LAST_TABLEBASE) AS F_LAST_TABLEBASE, MAX (F_TABLEBASE) AS F_TABLEBASE, SUM (F_OUGHTAMOUNT) AS F_OUGHTAMOUNT, SUM (F_OUGHTFEE) AS F_OUGHTFEE
FROM T_HANDPLAN
WHERE f_userinfo_id = '10155142'
AND F_HAND_DATE >= TO_DATE ( '2023-05-01 00:00:00', 'yyyy-mm-dd hh24:mi:ss' )
AND F_HAND_DATE <= TO_DATE ( '2023-05-31 23:59:59', 'yyyy-mm-dd hh24:mi:ss' )
GROUP BY TO_CHAR (f_hand_date, 'yyyy-MM-dd')
ORDER BY f_hand_date ASC
) WHERE ROWNUM <= :1;
```
其中,ORDER BY语句用于对查询结果进行排序,ASC表示升序排列,DESC表示降序排列。最后使用ROWNUM进行筛选,获取前N条记录。