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

Откуда:
Сообщений: 8
Добрый день.
Подскажите как можно определить
1)Порядковый номер дня в календарном году
2)Название дня
3)Порядковый номер недели в календарном месяце
4)Порядковый номер месяца в календарном году
5)Порядковый номер квартала в календарном году
На несколько лет. Например с 1600-1605
В FAQ не нашёл.
Заранее спасибо!
17 авг 14, 20:47    [16452801]     Ответить | Цитировать Сообщить модератору
 Re: Дата и время  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
http://msdn.microsoft.com/ru-ru/library/ms186724(v=sql.100).aspx
FAQ
17 авг 14, 20:56    [16452818]     Ответить | Цитировать Сообщить модератору
 Re: Дата и время  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
Date and Time Data Types and Functions (Transact-SQL)
17 авг 14, 20:58    [16452825]     Ответить | Цитировать Сообщить модератору
 Re: Дата и время  [new]
LeroiJenkins
Member

Откуда:
Сообщений: 8
Спасибо. А как это всё рассчитать для нескольких лет?
17 авг 14, 20:59    [16452832]     Ответить | Цитировать Сообщить модератору
 Re: Дата и время  [new]
Офисный Хомячок
Member

Откуда: Офис
Сообщений: 1358
LeroiJenkins
Спасибо. А как это всё рассчитать для нескольких лет?


Я бы рекомендовал написать скрипт.
17 авг 14, 21:38    [16452960]     Ответить | Цитировать Сообщить модератору
 Re: Дата и время  [new]
LeroiJenkins
Member

Откуда:
Сообщений: 8
Я понимаю, что нужно написать скрипт) Только не знаю как) Потому и спрашиваю. Был бы очень признателен за любой пример.
17 авг 14, 21:42    [16452978]     Ответить | Цитировать Сообщить модератору
 Re: Дата и время  [new]
Офисный Хомячок
Member

Откуда: Офис
Сообщений: 1358
DECLARE @ToDate DATE, @FromDate DATE
SET @ToDate = '16050101'
SET @FromDate = '16000101'

;WITH Days(D) AS
(
 SELECT @FromDate WHERE @FromDate <= @ToDate
 UNION ALL
 SELECT DATEADD(DAY,1,D) FROM Days WHERE D < @ToDate
)
SELECT D FROM Days ORDER BY D
OPTION (MAXRECURSION 0)


Вы не озвучили версию сервера.

Пример генерации дат. Нужные опции сами прикрутите, ссылку вам дали.
17 авг 14, 21:59    [16453051]     Ответить | Цитировать Сообщить модератору
 Re: Дата и время  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
LeroiJenkins
Был бы очень признателен за любой пример.
create table dbo.Calendar
(
 d date not null,
 d_DayOfYear as datediff(day, dateadd(year, datediff(year, '1900', d), '1900'), d) + 1,
 d_Month as month(d),
 d_Week as datepart(week, d),
 d_Quarter as datepart(quarter, d),
 constraint PK_Calendar primary key (d)
);
go

insert into dbo.Calendar
select top (100)
 dateadd(day, row_number() over (order by char('a')) - 1, '2014')
from
 master.dbo.spt_values
go

select * from dbo.Calendar;
go

drop table dbo.Calendar;
go
17 авг 14, 22:07    [16453076]     Ответить | Цитировать Сообщить модератору
 Re: Дата и время  [new]
LeroiJenkins
Member

Откуда:
Сообщений: 8
DECLARE @Year VARCHAR (50)
DECLARE @EndYear VARCHAR (50)
SET @Year = '02/02/2002'
SET @EndYear = '01/31/2014'
SET LANGUAGE Russian
while (@Year <= @EndYear)
BEGIN
SELECT CAST(convert(char(8),@Year,112) as datetime)							        AS 'CalendarYear',
	   DATENAME(month, @Year)											            AS 'Month Name', 
	   DATEPART(DAYOFYEAR,@Year)											        AS 'NumberDayInCalendarYear',
	   DATEPART(QUARTER, @Year)												        AS 'NumverOfQuarter',
	   DATEPART(MONTH, @Year)													    AS 'NubmerMounthInCalendarYear',
	   DATEPART(WEEK, @Year)														AS 'NumberOfWeekInCalendarYear',
	   CAST(convert(char(6),@Year,112)+'01' as datetime)							AS 'CalendarMonthStartDate',
	   DATEADD(day,-1, CONVERT(char(6), DATEADD(MONTH,1,@Year),112)+'01')			AS 'CalendarMonthEndDate'
	   
END


Спасибо. Сделал так. Как мне вывести на экран результат? А то на экран не выводит
17 авг 14, 22:32    [16453140]     Ответить | Цитировать Сообщить модератору
 Re: Дата и время  [new]
Офисный Хомячок
Member

Откуда: Офис
Сообщений: 1358
LeroiJenkins
DECLARE @Year VARCHAR (50)
DECLARE @EndYear VARCHAR (50)
SET @Year = '02/02/2002'
SET @EndYear = '01/31/2014'
SET LANGUAGE Russian
while (@Year <= @EndYear)
BEGIN
SELECT CAST(convert(char(8),@Year,112) as datetime)							        AS 'CalendarYear',
	   DATENAME(month, @Year)											            AS 'Month Name', 
	   DATEPART(DAYOFYEAR,@Year)											        AS 'NumberDayInCalendarYear',
	   DATEPART(QUARTER, @Year)												        AS 'NumverOfQuarter',
	   DATEPART(MONTH, @Year)													    AS 'NubmerMounthInCalendarYear',
	   DATEPART(WEEK, @Year)														AS 'NumberOfWeekInCalendarYear',
	   CAST(convert(char(6),@Year,112)+'01' as datetime)							AS 'CalendarMonthStartDate',
	   DATEADD(day,-1, CONVERT(char(6), DATEADD(MONTH,1,@Year),112)+'01')			AS 'CalendarMonthEndDate'
	   
END


Спасибо. Сделал так. Как мне вывести на экран результат? А то на экран не выводит



+
DECLARE @Year VARCHAR (50)
DECLARE @EndYear VARCHAR (50)
SET @Year = '20020202'
SET @EndYear = '20143101'
SET LANGUAGE Russian
while (@Year <= @EndYear)
BEGIN
SELECT CAST(convert(char(8),@Year,112) as datetime)							        AS 'CalendarYear',
	   DATENAME(month, @Year)											            AS 'Month Name', 
	   DATEPART(DAYOFYEAR,@Year)											        AS 'NumberDayInCalendarYear',
	   DATEPART(QUARTER, @Year)												        AS 'NumverOfQuarter',
	   DATEPART(MONTH, @Year)													    AS 'NubmerMounthInCalendarYear',
	   DATEPART(WEEK, @Year)														AS 'NumberOfWeekInCalendarYear',
	   CAST(convert(char(6),@Year,112)+'01' as datetime)							AS 'CalendarMonthStartDate',
	   DATEADD(day,-1, CONVERT(char(6), DATEADD(MONTH,1,@Year),112)+'01')			AS 'CalendarMonthEndDate'
	   
END


Маленький совет всегда пишите дату в формате YYYYMMDD - так сервер вас не поймет превратно.

И да в "боевых" запросах советую избегать циклов. До тех пор пока не наберетесь опыта.
17 авг 14, 22:47    [16453176]     Ответить | Цитировать Сообщить модератору
 Re: Дата и время  [new]
LeroiJenkins
Member

Откуда:
Сообщений: 8
Подскажите, я видимо написал какую то чушь?) Ибо у меня этот запрос 5 минут выполнялся, потом всё зависло и пришлось ресетиться.) Можно как-нибудь сделать через цикл что бы не было таких проблем?
17 авг 14, 23:00    [16453199]     Ответить | Цитировать Сообщить модератору
 Re: Дата и время  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31965
LeroiJenkins
Подскажите, я видимо написал какую то чушь?) Ибо у меня этот запрос 5 минут выполнялся, потом всё зависло и пришлось ресетиться.) Можно как-нибудь сделать через цикл что бы не было таких проблем?
Вы написали бесконечный цикл, у вас же значения переменных не меняются.

Как сделать - вам написали пару вариантов.
18 авг 14, 00:36    [16453457]     Ответить | Цитировать Сообщить модератору
 Re: Дата и время  [new]
LeroiJenkins
Member

Откуда:
Сообщений: 8
Я понимаю. Меня интересует как моно сделать через цикл.
18 авг 14, 00:42    [16453478]     Ответить | Цитировать Сообщить модератору
 Re: Дата и время  [new]
Офисный Хомячок
Member

Откуда: Офис
Сообщений: 1358
LeroiJenkins
Я понимаю. Меня интересует как моно сделать через цикл.


Завести переменную цикла и при каждом проходе ее инкремировать/декриментировать, задать корректное условия окончания цикла?

ИМХО но так делать не нужно!
18 авг 14, 00:46    [16453495]     Ответить | Цитировать Сообщить модератору
 Re: Дата и время  [new]
LeroiJenkins
Member

Откуда:
Сообщений: 8
Можете привести пример как это сделать? Я понимаю что это плохо, но нужно именно так.
18 авг 14, 00:59    [16453550]     Ответить | Цитировать Сообщить модератору
 Re: Дата и время  [new]
LeroiJenkins
Member

Откуда:
Сообщений: 8
И ещё, если можно, объясните почему это плохо?
18 авг 14, 01:01    [16453561]     Ответить | Цитировать Сообщить модератору
 Re: Дата и время  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31965
LeroiJenkins
И ещё, если можно, объясните почему это плохо?
Потому что один запрос выполнится быстрее, чем по одному запросу на каждую дату. Это как бы вместо использования оператора "+" для сложения чисел использовать цикл по битам этих чисел.

LeroiJenkins
Можете привести пример как это сделать? Я понимаю что это плохо, но нужно именно так.
Переменные для цикла у вас есть - например, @Year и @EndYear

Только у вас они типа "строка". Как вы будете делать операции сложения или вычитания со строками???

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

Ещё можно найти примеры циклов в справке, набраd слово "WHILE"
18 авг 14, 01:08    [16453604]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить