我有Date_added列作为日期类型,我想将其更改为一周的第一天(星期一)... 例如
输入:
2018/07/19
2018/06/20
2018/06/21
2018/05/15
etc...
输出:
2018/07/16
2018/06/18
2018/06/18
2018/05/14
etc...
我有成千上万的记录,如何使用DATEADD或呢?
答案 0 :(得分:2)
如果要将日期截断为ISO周的开始(星期一午夜),则:
SELECT TRUNC( date_column, 'IW' )
FROM your_table;
如果您希望具有相同的时间分量,则可以使用:
NEXT_DAY( date_column - 7, 'MONDAY' )
但是,如果日期语言不匹配,则会出现异常:
ALTER SESSION SET NLS_DATE_LANGUAGE = 'FRENCH'
SELECT date_column,
NEXT_DAY( date_column - 7, 'MONDAY' )
FROM table_name;
输出:
ORA-01846: not a valid day of the week
或者,您可以使用独立于语言的方法:
date_column - ( TRUNC( date_column ) - TRUNC( date_column, 'IW' ) )
例如:
Oracle 11g R2架构设置:
CREATE TABLE table_name ( date_column ) AS
SELECT SYSDATE FROM DUAL UNION ALL
SELECT TRUNC( SYSDATE ) FROM DUAL;
查询1 :
SELECT date_column,
TRUNC( date_column, 'IW' ) AS monday_midnight,
date_column - ( TRUNC( date_column ) - TRUNC( date_column, 'IW' ) ) AS monday_with_time
FROM table_name
Results :
| DATE_COLUMN | MONDAY_MIDNIGHT | MONDAY_WITH_TIME |
|----------------------|----------------------|----------------------|
| 2018-07-16T22:17:22Z | 2018-07-16T00:00:00Z | 2018-07-16T22:17:22Z |
| 2018-07-16T00:00:00Z | 2018-07-16T00:00:00Z | 2018-07-16T00:00:00Z |
答案 1 :(得分:1)
否,您不能在Oracle中使用DATEADD()
。它不存在。您可以使用NEXT_DAY()
:
select next_day(datecol - 7, 'Monday')
NEXT_DAY()
获取星期几的下一个日期。