Генерируйте диапазон дат с помощью SQL

from flask import request
request.data
29
задан Palec 28 September 2016 в 12:14
поделиться

7 ответов

Нет никакой потребности использовать очень большие таблицы или таблицу ALL_OBJECTS:

SELECT TRUNC (SYSDATE - ROWNUM) dt
  FROM DUAL CONNECT BY ROWNUM < 366

добьется цели.

87
ответ дан user34850 28 November 2019 в 00:36
поделиться

Конкретная Oracle, и не полагается на существующие ранее большие таблицы или сложные системные представления по объектам словаря данных.

SELECT c1 from dual
  MODEL DIMENSION BY (1 as rn)  MEASURES (sysdate as c1)
  RULES ITERATE (365) 
  (c1[ITERATION_NUMBER]=SYSDATE-ITERATION_NUMBER)
order by 1
3
ответ дан Gary Myers 28 November 2019 в 00:36
поделиться

Метод, вполне часто используемый в Oracle, является чем-то вроде этого:

select trunc(sysdate)-rn
from
(   select rownum rn
    from   dual
    connect by level <= 365)
/

Лично, если бы приложение имеет потребность в списке дат тогда, я просто составил бы таблицу с ними или составил бы таблицу с серией целых чисел до чего-то смешного как один миллион, который может использоваться для этого вида вещи.

3
ответ дан David Aldridge 28 November 2019 в 00:36
поделиться

Ahahaha, вот забавный способ, которым я просто придумал, чтобы сделать это:

select SYSDATE - ROWNUM
from shipment_weights sw
where ROWNUM < 365;

, где shipment_weights является любой большой таблицей;

2
ответ дан George Mauer 28 November 2019 в 00:36
поделиться

Ради удовольствия вот некоторый код, который должен работать в SQL Server, Oracle или MySQL:

SELECT current_timestamp - CAST(d1.digit + d2.digit + d3.digit as int)
FROM 
(
    SELECT digit
    FROM
    (
        select '1' as digit
        union select '2'
        union select '3'
        union select '4'
        union select '5'
        union select '6'
        union select '7'
        union select '8'
        union select '9'
        union select '0'
    ) digits
) d1
CROSS JOIN
(
    SELECT digit
    FROM
    (
        select '1' as digit
        union select '2'
        union select '3'
        union select '4'
        union select '5'
        union select '6'
        union select '7'
        union select '8'
        union select '9'
        union select '0'
    ) digits
) d2
CROSS JOIN
(
    SELECT digit
    FROM
    (
        select '1' as digit
        union select '2'
        union select '3'
        union select '4'
        union select '5'
        union select '6'
        union select '7'
        union select '8'
        union select '9'
        union select '0'
    ) digits
) d3
WHERE CAST(d1.digit + d2.digit + d3.digit as int) < 365
ORDER BY d1.digit, d2.digit, d3.digit -- order not really needed here

Бонусные очки, если можно дать мне межплатформенный синтаксис, чтобы снова использовать таблицу цифр.

1
ответ дан Joel Coehoorn 28 November 2019 в 00:36
поделиться

У меня нет ответа, чтобы снова использовать таблицу цифр, но вот пример кода, который будет работать, по крайней мере, в SQL-сервере и немного быстрее.

print("code sample");

select  top 366 current_timestamp - row_number() over( order by l.A * r.A) as DateValue
from (
select  1 as A union
select  2 union
select  3 union
select  4 union
select  5 union
select  6 union
select  7 union
select  8 union
select  9 union
select  10 union
select  11 union
select  12 union
select  13 union
select  14 union
select  15 union
select  16 union
select  17 union
select  18 union
select  19 union
select  20 union
select  21 
) l
cross join (
select 1 as A union
select 2 union
select 3 union
select 4 union
select 5 union
select 6 union
select 7 union
select 8 union
select 9 union
select 10 union
select 11 union
select 12 union
select 13 union
select 14 union
select 15 union
select 16 union
select 17 union
select 18
) r
print("code sample");
0
ответ дан Joel Coehoorn 28 November 2019 в 00:36
поделиться

Опоздал примерно на полтора года, но для потомков вот версия для Teradata:

SELECT calendar_date 
FROM SYS_CALENDAR.Calendar
WHERE SYS_CALENDAR.Calendar.calendar_date between '2010-01-01' (date) and '2010-01-03' (date)
3
ответ дан 28 November 2019 в 00:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: