Получение Дат между диапазоном дат

<input type="text" name="country_code" pattern="^(\d|[1-9]\d|1\d\d|2([0-4]\d|5[0-5])).(\d|[1-9]\d|1\d\d|2([0-4]\d|5[0-5])).(\d|[1-9]\d|1\d\d|2([0-4]\d|5[0-5])).(\d|[1-9]\d|1\d\d|2([0-4]\d|5[0-5]))(,(\d|[1-9]\d|1\d\d|2([0-4]\d|5[0-5])).(\d|[1-9]\d|1\d\d|2([0-4]\d|5[0-5])).(\d|[1-9]\d|1\d\d|2([0-4]\d|5[0-5])).(\d|[1-9]\d|1\d\d|2([0-4]\d|5[0-5])))*$">

Используйте это поле ввода в вашем файле HTML

16
задан Thomas Bratt 20 September 2009 в 21:20
поделиться

6 ответов

Здесь Вы идете:

DECLARE @DateFrom smalldatetime, @DateTo smalldatetime;
SET @DateFrom='20000101';
SET @DateTo='20081231';
-------------------------------
WITH T(date)
AS
( 
SELECT @DateFrom 
UNION ALL
SELECT DateAdd(day,1,T.date) FROM T WHERE T.date < @DateTo
)
SELECT date FROM T OPTION (MAXRECURSION 32767);
57
ответ дан 30 November 2019 в 15:14
поделиться

Если Вы имеете даты в таблице и просто хотите выбрать тех между двумя датами, можно использовать

select * from yourTable where yourDate between date1 and date2

, Если Вы хотите произвести даты ни из чего, что Вы могли бы сделать это с циклом, или Вы могли заполнить временную таблицу с датами и затем выбрать из этого.

8
ответ дан 30 November 2019 в 15:14
поделиться

Вот версия Oracle поколения даты:

SELECT TO_DATE ('01-OCT-2008') + ROWNUM - 1 g_date
  FROM all_objects
 WHERE ROWNUM <= 15

вместо all_objects это может быть любая таблица с достаточным количеством строк для покрытия необходимого диапазона.

0
ответ дан 30 November 2019 в 15:14
поделиться

Если то, что Вы хотите, должно получить весь подарок дат в Вашей базе данных между двумя датами (т.е. какие даты имеют размещенные заказы клиентов в Q3 2008), Вы запишете что-то вроде этого:

select distinct(orderPlacedDate) 
from orders 
where orderPlacedDate between '2008-07-01' and 2008-09-30' 
order by orderPlacedDate
-2
ответ дан 30 November 2019 в 15:14
поделиться

Для генерации диапазона дат, Вы могли записать табличную функцию. Это - функция, которая создает размер даты для хранилища данных - Вы могли, вероятно, адаптировать его справедливо с готовностью путем обрезки экстренного сообщения.

Редактирование: Здесь это без иерархии измерений даты.

if object_id ('ods.uf_DateHierarchy') is not null
    drop function ods.uf_DateHierarchy
go

create function ods.uf_DateHierarchy (
       @DateFrom datetime
      ,@DateTo   datetime
) returns @DateHierarchy table (
        DateKey           datetime
) as begin
    declare @today           datetime  
    set @today = @Datefrom

    while @today <= @DateTo begin
        insert @DateHierarchy (DateKey) values (@today)
        set @today = dateadd (dd, 1, @today)
    end

    return
end

go
-3
ответ дан 30 November 2019 в 15:14
поделиться

Немного сложнее, но, возможно, более гибко было бы использовать таблицу, содержащую последовательный набор чисел. Это позволяет использовать более одного диапазона дат с разными интервалами.

/* holds a sequential set of number ie 0 to max */
/* where max is the total number of rows expected */
declare @Numbers table ( Number int  )

declare @max int 
declare @cnt int

set @cnt = 0
/* this value could be limited if you knew the total rows expected */
set @max = 999 

/* we are building the NUMBERS table on the fly */
/* but this could be a proper table in the database */
/* created at the point of first deployment */
while (@cnt <= @max)
begin
      insert into @Numbers select @cnt
      set @cnt = @cnt + 1
end

/* EXAMPLE of creating dates with different intervals */

declare @DateRanges table ( 
   StartDateTime datetime, EndDateTime datetime, Interval int )

/* example set of date ranges */
insert into @DateRanges
select '01 Jan 2009', '10 Jan 2009', 1 /* 1 day interval */
union select '01 Feb 2009', '10 Feb 2009', 2 /* 2 day interval */

/* heres the important bit generate the dates */
select
      StartDateTime
from
(
      select
            d.StartDateTime as RangeStart,
            d.EndDateTime as RangeEnd,
            dateadd(DAY, d.Interval * n.Number, d.StartDateTime) as StartDateTime
      from 
            @DateRanges d, @Numbers n
) as dates
where
      StartDateTime between RangeStart and RangeEnd
order by StartDateTime

На самом деле я использую вариант этого, чтобы разделить даты на временные интервалы (с различными интервалами, но обычно длительностью 5 минут). Моя таблица @numbers содержит не более 288, поскольку это общее количество 5-минутных интервалов, которые вы можете иметь за 24-часовой период.

/* EXAMPLE of creating times with different intervals */

delete from @DateRanges 

/* example set of date ranges */
insert into @DateRanges
select '01 Jan 2009 09:00:00', '01 Jan 2009 12:00:00', 30 /* 30 minutes interval */
union select '02 Feb 2009 09:00:00', '02 Feb 2009 10:00:00', 5 /* 5 minutes interval */

/* heres the import bit generate the times */
select
      StartDateTime,
      EndDateTime
from
(
      select
            d.StartDateTime as RangeStart,
            d.EndDateTime as RangeEnd,
            dateadd(MINUTE, d.Interval * n.Number, d.StartDateTime) as StartDateTime,
            dateadd(MINUTE, d.Interval * (n.Number + 1) , StartDateTime) as EndDateTime
      from 
            @DateRanges d, @Numbers n
) as dates
where
      StartDateTime >= RangeStart and EndDateTime <= RangeEnd
order by StartDateTime
1
ответ дан 30 November 2019 в 15:14
поделиться
Другие вопросы по тегам:

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