首页 > 解决方案 > 以 dd/mm/yy 格式返回过去 6 个月的所有日期

问题描述

我希望从过去 6 个月的所有日子回来。

每个例子:

Column1
-------
01-OCT-18
30-SEP-18
29-SEP-18
........
01-APR-18

@TimBiegeleisen - 你的解决方案为我指明了正确的方向,所以你得到了分数。

@MT0 - 据我所知,“ADD_MONTHS”没有在 T-SQL 中使用,所以我认为有必要进行澄清。但感谢您提供更新的指针,将来不会这样做。

标签: sqloracle

解决方案


这将为您提供过去 6 个月的所有日期(以您的示例中的格式):

SQL小提琴

查询 1

SELECT TO_CHAR( SYSDATE - LEVEL + 1, 'DD-MON-RR' ) AS Column1
FROM   DUAL
CONNECT BY SYSDATE - LEVEL + 1 >= ADD_MONTHS( SYSDATE, -6 )

结果

|   COLUMN1 |
|-----------|
| 11-OCT-18 |
| 10-OCT-18 |
| 09-OCT-18 |
...
| 13-APR-18 |
| 12-APR-18 |
| 11-APR-18 |

更新

这个想法是生成过去 6 个月的天数列表,并计算每个日期记录特定值的次数

SQL小提琴

Oracle 11g R2 模式设置

创建一个包含多行不同日期的示例表:

CREATE TABLE table_name ( value ) AS
          SELECT TRUNC( SYSDATE ) - 0 FROM DUAL CONNECT BY LEVEL <= 5
UNION ALL SELECT TRUNC( SYSDATE ) - 1 FROM DUAL CONNECT BY LEVEL <= 3
UNION ALL SELECT TRUNC( SYSDATE ) - 2 FROM DUAL CONNECT BY LEVEL <= 7
UNION ALL SELECT TRUNC( SYSDATE ) - 3 FROM DUAL CONNECT BY LEVEL <= 2
UNION ALL SELECT TRUNC( SYSDATE ) - 4 FROM DUAL CONNECT BY LEVEL <= 1

查询 1

SELECT TO_CHAR( c.Column1, 'DD-MON-RR' ) AS Column1,
       COUNT( t.value ) AS num_values_per_day
FROM   (
         SELECT TRUNC( SYSDATE ) - LEVEL + 1 AS Column1
         FROM   DUAL
         CONNECT BY TRUNC( SYSDATE ) - LEVEL + 1 >= ADD_MONTHS( SYSDATE, -6 )
       ) c
       LEFT OUTER JOIN table_name t
       ON ( c.column1 = t.value )
GROUP BY c.Column1
ORDER BY c.Column1 DESC

结果

|   COLUMN1 | NUM_VALUES_PER_DAY |
|-----------|--------------------|
| 11-OCT-18 |                  5 |
| 10-OCT-18 |                  3 |
| 09-OCT-18 |                  7 |
| 08-OCT-18 |                  2 |
| 07-OCT-18 |                  1 |
| 06-OCT-18 |                  0 |
| 05-OCT-18 |                  0 |
...
| 14-APR-18 |                  0 |
| 13-APR-18 |                  0 |
| 12-APR-18 |                  0 |

推荐阅读