Sql 如何按ISO周排序并从今天的周数开始
我想从oracle查询数据并按周排序,但结果是从第52周开始,现在实际上是第44周。 这是我的sql:Sql 如何按ISO周排序并从今天的周数开始,sql,oracle,Sql,Oracle,我想从oracle查询数据并按周排序,但结果是从第52周开始,现在实际上是第44周。 这是我的sql: SELECT * FROM (SELECT to_char(contract.MIGRATION_SUCCESS_DATE,'yyyy-iw') metric, sum(contract.BLIS_MRR) mrr, count(contract.CONTRACT_ID) coun
SELECT *
FROM (SELECT
to_char(contract.MIGRATION_SUCCESS_DATE,'yyyy-iw') metric,
sum(contract.BLIS_MRR) mrr,
count(contract.CONTRACT_ID) count
FROM (SELECT DISTINCT
CONTRACT_ID,
BLIS_MRR,
MIGRATION_SUCCESS_DATE
FROM MR_MIGRATION_SITE) contract WHERE MIGRATION_SUCCESS_DATE < sysdate
GROUP BY to_char(contract.MIGRATION_SUCCESS_DATE,'yyyy-iw'))
ORDER BY metric DESC;
下图是结果:
当日期和该日期所在周的星期一在不同年份时,您会遇到问题 要解决此问题,您可以使用和IYY iw格式获取ISO年和周:
TO_CHAR( contract.MIGRATION_SUCCESS_DATE, 'IYYY-IW' )
初始不正确的解决方案:
要解决此问题,您可以将日期截断为ISO周的开始,然后将其转换为yyyy iw格式:
例如:
Oracle 11g R2架构设置:
问题1:
:
我认为您必须使用格式来保存合同。迁移成功日期,'iyy-iw' ISO周的年份可以不同于实际年份,例如2017年1月1日是2016年的第52周,即根据ISO定义为2016-W52 我建议使用格式“iyy-Wiw”,它符合
也许可以将您的GROUP BY子句更改为GROUP BY TRUNCcontract.MIGRATION_SUCCESS_DATE,'iw'其中MIGRATION_SUCCESS_DATE
TO_CHAR(
TRUNC( contract.MIGRATION_SUCCESS_DATE, 'IW' )
'yyyy-iw'
)
CREATE TABLE test_data( dt ) AS
SELECT DATE '2016-12-31' FROM DUAL UNION ALL
SELECT DATE '2017-01-01' FROM DUAL UNION ALL
SELECT DATE '2017-01-02' FROM DUAL UNION ALL
SELECT DATE '2014-12-31' FROM DUAL;
SELECT dt,
TO_CHAR( dt, 'iyyy-iw' ) AS trunc_iw,
TO_CHAR( TRUNC( dt, 'IW' ), 'yyyy-iw' ) AS trunc_iw2,
TO_CHAR( dt, 'yyyy-iw' ) AS non_trunc_iw
FROM test_data
| DT | TRUNC_IW | TRUNC_IW2 | NON_TRUNC_IW |
|----------------------|----------|-----------|--------------|
| 2016-12-31T00:00:00Z | 2016-52 | 2016-52 | 2016-52 |
| 2017-01-01T00:00:00Z | 2016-52 | 2016-52 | 2017-52 |
| 2017-01-02T00:00:00Z | 2017-01 | 2017-01 | 2017-01 |
| 2014-12-31T00:00:00Z | 2015-01 | 2014-01 | 2014-01 | -- initial version is incorrect for this date