如何将日期字段更改为一周的第一天-Oracle

时间:2018-07-16 20:04:58

标签: sql oracle

我有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或呢?

2 个答案:

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

例如:

SQL Fiddle

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()获取星期几的下一个日期。