Sql 以dd/mm/yy格式返回过去6个月的所有日期

Sql 以dd/mm/yy格式返回过去6个月的所有日期,sql,oracle,Sql,Oracle,我希望在过去6个月的所有日子里都能回来 每个示例: Column1 ------- 01-OCT-18 30-SEP-18 29-SEP-18 ........ 01-APR-18 @TimBiegeleisen-你的解决方案为我指明了正确的方向,所以你得到了分数 @据我所知,T-SQL中没有使用MT0-“添加月份”,因此我认为有必要进行澄清。但是,感谢您提供了更新的指针,以后将不再这样做。我们可以将列1中的每个日期与6个月前的SYSDATE进行比较,然后使用带有适当格式掩码的TO_CHAR以

我希望在过去6个月的所有日子里都能回来

每个示例:

Column1
-------
01-OCT-18
30-SEP-18
29-SEP-18
........
01-APR-18
@TimBiegeleisen-你的解决方案为我指明了正确的方向,所以你得到了分数


@据我所知,T-SQL中没有使用MT0-“添加月份”,因此我认为有必要进行澄清。但是,感谢您提供了更新的指针,以后将不再这样做。

我们可以将
列1
中的每个日期与6个月前的
SYSDATE
进行比较,然后使用带有适当格式掩码的
TO_CHAR
以您想要的格式显示日期:

SELECT
    TO_CHAR(Column1, 'dd/mm/yy') AS output
FROM yourTable
WHERE
    Column1 >= ADD_MONTHS(SYSDATE, -6);

我们可以将
列1
中的每个日期与6个月前的
SYSDATE
进行比较,然后使用
TO_CHAR
和适当的格式掩码以您想要的格式显示日期:

SELECT
    TO_CHAR(Column1, 'dd/mm/yy') AS output
FROM yourTable
WHERE
    Column1 >= ADD_MONTHS(SYSDATE, -6);

这将获得过去6个月的所有日期(以示例中的格式):

查询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 |
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 |

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 |
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 |

更新

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

Oracle 11g R2架构设置

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 |
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 |
创建一个示例表,其中包含不同日期的多行:

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

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 |
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 |

这将获得过去6个月的所有日期(以示例中的格式):

查询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 |
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 |

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 |
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 |

更新

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

Oracle 11g R2架构设置

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 |
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 |
创建一个示例表,其中包含不同日期的多行:

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

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 |
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 |

因此,对于评论中提供的额外任务,您可能需要稍微调整Tim Biegeleisens解决方案:

SELECT TRUNC(Column1) AS "Day"
     , count(*) as "Count"
  FROM yourTable
 GROUP BY TRUNC(Column1)
 WHERE Column1 >= ADD_MONTHS(SYSDATE, -6);

因此,对于评论中提供的额外任务,您可能需要稍微调整Tim Biegeleisens解决方案:

SELECT TRUNC(Column1) AS "Day"
     , count(*) as "Count"
  FROM yourTable
 GROUP BY TRUNC(Column1)
 WHERE Column1 >= ADD_MONTHS(SYSDATE, -6);

我将添加更多内容,但这是我需要的起点,我尝试使用“按级别连接”使查询过于复杂,我以前的查询在将来的日期中运行良好,但不会返回sysdate之前的任何内容(我将对上面的内容进行更多的研究,以了解它是如何工作的,但目前我知道的还不够多)

感谢您的回答,我通过以下方式找到了我想要的解决方案:

SELECT  col1
FROM    table1
WHERE   col1 >= add_months(sysdate,-6)

我将添加更多内容,但这是我需要的起点,我尝试使用“按级别连接”使查询过于复杂,我以前的查询在将来的日期中运行良好,但不会返回sysdate之前的任何内容(我将对上面的内容进行更多的研究,以了解它是如何工作的,但目前我知道的还不够多)

感谢您的回答,我通过以下方式找到了我想要的解决方案:

SELECT  col1
FROM    table1
WHERE   col1 >= add_months(sysdate,-6)

您是希望从日期列>=六个月前的表中获取行,还是希望生成从六个月前到现在(或到当前月初)的日期列表?此外,为什么需要dd/mm/yy格式?年份有四位数字,因此您应该使用yyyy,除非您有很好的理由不这样做(例如,仅用于报告目的;如果其他程序需要使用任何内容,则应始终使用四位数年份)。您想生成一个过去几个月内所有日期的列表,而不考虑任何表数据,对吗?为什么要用PL/SQL解决这个问题?SQL查询不够吗?您使用的是哪种Oracle版本?我对PL/SQL不太熟悉,它来自t-SQL,并且仍在学习语法之间的差异,这对澄清非常重要,其想法是生成过去6个月内的天数列表,以及针对每个日期记录特定值的次数计数,例如,月1日的值数量为x,月2日的值数量为x等。与SQLSVR相比,oracle日期不适用,且有两个函数不同。这是一项学习任务,因此不需要我不想发布整个问题,因为我不会学到任何东西。@jackd102首先,那不是PL/SQL,它只是SQL(用Oracle方言)。其次,请提供表的详细信息、一些示例数据和预期结果。请不要将更新放在注释中,因为它们不可读。您是希望从日期列>=六个月前的表中获取行,还是希望生成从六个月前到现在(或到当前月初)的日期列表?此外,您为什么需要dd/mm/yy格式?年份有四位数,因此您应该使用yyyy,除非您有很好的理由不使用(例如,仅用于报告目的;如果其他程序使用任何内容,则应始终使用四位数的年份)。您想生成一个过去几个月内所有日期的列表,而不考虑任何表数据,对吗?为什么要用PL/SQL解决这个问题?SQL查询不够吗?您使用的是哪种Oracle版本?我对PL/SQL不太熟悉,它来自t-SQL,并且仍在学习语法之间的差异,这对澄清非常重要,其想法是生成过去6个月内的天数列表,以及针对每个日期记录特定值的次数计数,例如,月1日的值数量为x,月2日的值数量为x等。与SQLSVR相比,oracle日期不适用,且有两个函数不同。这是一项学习任务,因此不需要不要发布整个问题,因为我不会学到任何东西。@jackd102首先,这不是PL/SQL,它只是SQL(用Oracle方言)。其次,请提供表的详细信息、一些示例数据和预期结果。请不要将更新放在注释中,因为它们不可读。