Показывать дату и время от начала столбца до конца в SQL Server [дубликат]

Да. Мы будем использовать Java 8 в ближайшее время!

Мы решили добавить поддержку функций языка Java 8 непосредственно в текущий набор инструментов javac и dx и осудить инструментальную цепочку Jack. В этом новом направлении существующие инструменты и плагины, зависящие от формата файла классов Java, должны продолжать работать. Двигаясь вперед, функции языка Java 8 будут поддерживаться системой Android. Мы собираемся запустить это как часть Android Studio в ближайшие недели, и мы хотели бы поделиться этим решением с вами на ранней стадии.

https://android-developers.googleblog.com/2017/03/future-of-java-8-language-feature.html

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

7 ответов

DECLARE @Date1 DATE='2016-12-21', @Date2 DATE='2016-12-25'
SELECT DATEADD(DAY,number,@Date1) [Date] FROM master..spt_values WHERE type = 'P' AND DATEADD(DAY,number,@Date1) <= @Date2
4
ответ дан Baum mit Augen 28 August 2018 в 08:53
поделиться

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

select distinct(orderPlacedDate) 
from orders 
where orderPlacedDate between '2008-07-01' and 2008-09-30' 
order by orderPlacedDate
-2
ответ дан C B 28 August 2018 в 08:53
поделиться

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

/* 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
ответ дан Chris Moutray 28 August 2018 в 08:53
поделиться

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

Редактировать: здесь нет иерархии измерения даты.

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
ответ дан ConcernedOfTunbridgeWells 28 August 2018 в 08:53
поделиться

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

select * from yourTable where yourDate between date1 and date2

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

8
ответ дан Ed Guiness 28 August 2018 в 08:53
поделиться

Здесь вы:

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
ответ дан Incidently 28 August 2018 в 08:53
поделиться
  • 1
    Я копаю это решение. Используйте что-то похожее для временных графиков, поэтому на графике сохраняется согласованный интервал даже без совпадений записей за этот период времени в базе данных. – Kevin Fairchild 7 November 2008 в 16:30
  • 2
    Правильно. Это работает для генерации любых последовательностей: просто замените DateAdd (день, 1, T.date) на другую формулу this_item = F (previous_item) – Incidently 7 November 2008 в 16:44
  • 3
    Очень крутое решение с CTE. Я этого раньше не видел. – jons911 7 November 2008 в 17:12
  • 4
    Это скалы. Мне нужно было что-то, что дало бы мне все понедельники между двумя датами. Поэтому я использовал это с дополнительным фильтром, используя datepart и bam ... именно то, что мне нужно. +1 от меня. – RThomas 23 December 2011 в 00:33

Вот версия Oracle для генерации дат:

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

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

0
ответ дан user34850 28 August 2018 в 08:53
поделиться
Другие вопросы по тегам:

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