Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 работа с датами  [new]
noTpyJI
Member

Откуда:
Сообщений: 116
есть таблица
create table #ddate (id int IDENTITY (1,1), ddate datetime)


insert into #ddate
values ('20130101')
insert into #ddate
values (getdate())


iddate
101.01.2013 0:00:00
203.03.2013 12:49:28


Нужно написать запрос чтобы он вернул следующий результат

iddate
101.01.2013 0:00:00
202.01.2013 0:00:00
303.01.2013 0:00:00
404.01.2013 0:00:00
505.01.2013 0:00:00
итд итд
4003.03.2013 12:49:28

может дадите совет как можно решить эту задачу
3 мар 13, 13:08    [14005171]     Ответить | Цитировать Сообщить модератору
 Re: работа с датами  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 32174
noTpyJI
может дадите совет как можно решить эту задачу
Самое правильное - сделать в базе таблицу с датами, и потом делать запросы с джойном к ней.

Если таблицы делать нельзя, то придётся формировать список дат циклами, либо скрытыми циклами через CTE, ибо использовать любую постороннюю таблицу как непрерывный список чисел.
3 мар 13, 15:25    [14005426]     Ответить | Цитировать Сообщить модератору
 Re: работа с датами  [new]
iap
Member

Откуда: Москва
Сообщений: 47198
alexeyvg
noTpyJI
может дадите совет как можно решить эту задачу
Самое правильное - сделать в базе таблицу с датами, и потом делать запросы с джойном к ней.

Если таблицы делать нельзя, то придётся формировать список дат циклами, либо скрытыми циклами через CTE, ибо использовать любую постороннюю таблицу как непрерывный список чисел.
Бесполезны усилия ваши!
3 мар 13, 16:06    [14005495]     Ответить | Цитировать Сообщить модератору
 Re: работа с датами  [new]
imato
Member

Откуда: Москва
Сообщений: 80
noTpyJI,

Элементарно:

with day_s
as
(select cast('20130101' as smalldatetime) as date_time
union all
select date_time+1
from day_s
where date_time<=convert(smalldatetime, '2013-03-01 12:49:28', 120))

select date_time
from day_s
where date_time<=convert(smalldatetime, '2013-03-01 12:49:28', 120)
union all
select convert(smalldatetime, '2013-03-01 12:49:28', 120)
order by 1
option (maxrecursion 1000)
4 мар 13, 10:41    [14007332]     Ответить | Цитировать Сообщить модератору
 Re: работа с датами  [new]
nizamovich
Member

Откуда: Москва
Сообщений: 116
imato, не совсем верно, подкорректировал Ваш запрос, и убрал привязку к стат. значению даты

with day_s
as
(select cast('20120101' as smalldatetime) as date_time
union all
select date_time+1
from day_s
where date_time<=convert(smalldatetime, GETDATE()-1, 120))

select (case when date_time = cast(getdate() as date) then cast(GETDATE() as smalldatetime) else date_time end)
from day_s
order by 1
option (maxrecursion 1000) 
4 мар 13, 12:24    [14007972]     Ответить | Цитировать Сообщить модератору
 Re: работа с датами  [new]
iap
Member

Откуда: Москва
Сообщений: 47198
nizamovich
imato, не совсем верно, подкорректировал Ваш запрос, и убрал привязку к стат. значению даты

with day_s
as
(select cast('20120101' as smalldatetime) as date_time
union all
select date_time+1
from day_s
where date_time<=convert(smalldatetime, GETDATE()-1, 120))

select (case when date_time = cast(getdate() as date) then cast(GETDATE() as smalldatetime) else date_time end)
from day_s
order by 1
option (maxrecursion 1000) 
Что за ерунда?
CONVERT ничего не будет делать, если дату надо преобразовать в дату (!).
Зачем там CONVERT() вообще?
4 мар 13, 13:07    [14008204]     Ответить | Цитировать Сообщить модератору
 Re: работа с датами  [new]
iap
Member

Откуда: Москва
Сообщений: 47198
iap
nizamovich
imato, не совсем верно, подкорректировал Ваш запрос, и убрал привязку к стат. значению даты

with day_s
as
(select cast('20120101' as smalldatetime) as date_time
union all
select date_time+1
from day_s
where date_time<=convert(smalldatetime, GETDATE()-1, 120))

select (case when date_time = cast(getdate() as date) then cast(GETDATE() as smalldatetime) else date_time end)
from day_s
order by 1
option (maxrecursion 1000) 
Что за ерунда?
CONVERT ничего не будет делать, если дату надо преобразовать в дату (!).
Зачем там CONVERT() вообще?
Хотя, приврал немного.
Преобразование DATETIME в SMALLDATETIME приводит к округлению до целых секунд.
Но разве в этой теме это важно?
4 мар 13, 13:23    [14008347]     Ответить | Цитировать Сообщить модератору
 Re: работа с датами  [new]
Добряк_Михалыч
Member

Откуда:
Сообщений: 1
Попробуйте так. Это часть шуточной программульки, целью которой было составить табличку с датами, приходящимися на пятницу 13 с 01.01.1907 по настоящее время

close databases
erase c:\fr_13.dbf
create table c:\fr_13.dbf (dat d) && создали табличку с одним полем dat
append blank

repl dat with {01/01/1907} &&дата начала заполнения
do while dat<date() && до тех пор, пока не достигну сегодняшней даты
nom=dat
append blank &&добавляю строчку
go bottom && иду в конец таблички
repl dat with nom+1 && заполняю её предыдущей датой + 1 день
loop && возвращаю управление на начало цикла
enddo && конец конструкции do while**** enddo
4 мар 13, 13:49    [14008588]     Ответить | Цитировать Сообщить модератору
 Re: работа с датами  [new]
мимо
Guest
Добряк_Михалыч,

Какая версия Ms sql?
4 мар 13, 13:55    [14008629]     Ответить | Цитировать Сообщить модератору
 Re: работа с датами  [new]
iap
Member

Откуда: Москва
Сообщений: 47198
мимо
Добряк_Михалыч,

Какая версия Ms sql?
Простой вопрос, а ставит в тупик!
4 мар 13, 14:04    [14008712]     Ответить | Цитировать Сообщить модератору
 Re: работа с датами  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
мимо
Добряк_Михалыч,

Какая версия Ms sql?

create table c:\fr_13.dbf (dat d)

есно какая , дбфная
4 мар 13, 14:29    [14008934]     Ответить | Цитировать Сообщить модератору
 Re: работа с датами  [new]
Диклевич Александр
Member

Откуда:
Сообщений: 612
для DWH делал так, создал таблицу под измерение дат со всеми аттрибутами, и процедуру, которая ее заполняет. В своей базе
+

/*dim_dates*/
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[dim_dates]') AND type in (N'U'))
BEGIN
	CREATE TABLE [dbo].[dim_dates](
		[day_date] [date] NOT NULL,
		[calendar_year] [smallint] NOT NULL,
		[calendar_quarter] [tinyint] NOT NULL,
		[calendar_month] [tinyint] NOT NULL,
		[calendar_week] [int] NOT NULL,
		[calendar_day_of_year] [int] NOT NULL,
		[calendar_day_of_month] [tinyint] NOT NULL,
		[calendar_year_quarter] [int] NOT NULL,
		[calendar_year_month] [int] NOT NULL,
		[calendar_year_week] [int] NOT NULL,
		[calendar_year_month_day] [int] NOT NULL,
		[day_of_week] [tinyint] NOT NULL,
		[is_working_day] [int] NOT NULL,
		[year_quarter_name] [varchar](20) NOT NULL,
		[year_month_name] [varchar](20) NOT NULL,
		[year_month_day_name] [varchar](15) NOT NULL,
		[day_of_week_name] [varchar](15) NOT NULL,
		[quarter_name] [varchar](20) NOT NULL,
		[month_name] [varchar](20) NOT NULL,
		[is_working_day_name] [varchar](20) NOT NULL
	) ON [PRIMARY]
END
GO

IF NOT EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[dbo].[dim_dates]') AND name = N'PK_dim_dates')
ALTER TABLE [dbo].[dim_dates] ADD CONSTRAINT [PK_dim_dates] PRIMARY KEY CLUSTERED 
(
	[day_date] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO


/*FillDimDates*/
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[FillDimDates]') AND type in (N'P', N'PC'))
BEGIN
	DROP PROCEDURE [dbo].[FillDimDates]
END 
GO

CREATE PROCEDURE [dbo].[FillDimDates]
	@DateFrom [date],
	@DateTo [date]
WITH EXECUTE AS CALLER
AS
BEGIN
	DECLARE @DateF [date]
	SET @DateF = @DateFrom
	DECLARE @y [int], @q [int], @m [int], @w [int], @dy [int], @d [int], @dw [int]
	DECLARE @mname [varchar](20), @qname [varchar](20), @dwname [varchar](20)
	WHILE @DateF <= @DateTo
	BEGIN
		IF NOT EXISTS (SELECT * FROM [dbo].[dim_dates] WHERE [day_date] = @DateF)
		BEGIN
			SELECT
				@y = DATEPART(yyyy, @DateF),
				@q = DATEPART(qq, @DateF),
				@m = DATEPART(mm, @DateF),
				@w = DATEPART(ww, @DateF),
				@q = DATEPART(qq, @DateF),
				@dy = DATEPART(dy, @DateF),
				@d = DATEPART(dd, @DateF),
				@dw = (DATEPART(dw, @DateF) + @@DATEFIRST - 2) % 7 + 1
			
			SELECT
				@mname = CASE @m 
					WHEN 1 THEN 'January'
					WHEN 2 THEN 'February'
					WHEN 3 THEN 'March'
					WHEN 4 THEN 'April'
					WHEN 5 THEN 'May'
					WHEN 6 THEN 'June'
					WHEN 7 THEN 'July'
					WHEN 8 THEN 'August'
					WHEN 9 THEN 'September'
					WHEN 10 THEN 'October'
					WHEN 11 THEN 'November'
					ELSE 'December'
				END,
				@qname = CASE @q WHEN 1 THEN '1st' WHEN 2 THEN '2nd' WHEN 3 THEN '3rd' ELSE '4th' END + ' quarter',
				@dwname = CASE @dw
					WHEN 1 THEN 'Monday'
					WHEN 2 THEN 'Tuesday'
					WHEN 3 THEN 'Wednesday'
					WHEN 4 THEN 'Thursday'
					WHEN 5 THEN 'Friday'
					WHEN 6 THEN 'Saturday'
					WHEN 7 THEN 'Sunday'
				END
				
			INSERT INTO [dbo].[dim_dates](
				[day_date]
				,[calendar_year]
				,[calendar_quarter]
				,[calendar_month]
				,[calendar_week]
				,[calendar_day_of_year]
				,[calendar_day_of_month]
				,[calendar_year_quarter]
				,[calendar_year_month]
				,[calendar_year_week]
				,[calendar_year_month_day]
				,[day_of_week]
				,[is_working_day]
				,[year_quarter_name]
				,[year_month_name]
				,[year_month_day_name]
				,[day_of_week_name]
				,[quarter_name]
				,[month_name]
				,[is_working_day_name]			
			)
			SELECT
				@DateF
				,@y
				,@q
				,@m
				,@w
				,@dy
				,@d
				,@y * 10 + @q
				,@y * 100 + @m
				,@y * 100 + @w
				,@y * 10000 + @m * 100 + @d
				,@dw
				,CASE WHEN @dw <= 5 THEN 1 ELSE 0 END
				,@qname + ' ' + CAST(@y AS char(4))
				,@mname + ' ' + CAST(@y AS char(4))
				,CAST(@m AS varchar(2)) + '/' +	CAST(@d AS varchar(2)) + '/' +	CAST(@y AS varchar(4))
				,@dwname
				,@qname
				,@mname
				,CASE WHEN @dw <= 5 THEN 'Working day' ELSE 'Holiday' END
		END		
		SET @DateF = DATEADD(dd, 1, @DateF)
	END
END
GO


ну и потом EXEC [FillDimDates] '2013-01-01', '2013-03-03'
4 мар 13, 14:41    [14009032]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить