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

Откуда:
Сообщений: 251
declare @d1 date, @d2 date
set @d1='01.01.2005'
set @d2='01.01.2040'
while @d1<>@d2
begin
update [дата] set [дата]=dateadd(MONTH,1,@d1)
end


мой код что-то совсем не работает(((

нужно получить список дат.
таблица дата имеет 1 поле типа дата.
в результате должно получиться
янв. 2005
фев.2005
......
дек. 2039
янв. 2040

ну или хотя бы:
01.01.2005
01.02.2005
.....
01.12.2039
01.01.2040
заранее спасибо.
20 авг 12, 17:53    [13038628]     Ответить | Цитировать Сообщить модератору
 Re: Помогите получить список дат.Код в тексте письма  [new]
ola_ya_22
Member

Откуда:
Сообщений: 251
точнее так

declare @d1 date, @d2 date
set @d1='01.01.2005'
set @d2='01.01.2090'
while @d1<>@d2
begin
update [дата] set [дата]=@d1
set @d1=dateadd(MONTH,1,@d1)
end
20 авг 12, 17:57    [13038650]     Ответить | Цитировать Сообщить модератору
 Re: Помогите получить список дат.Код в тексте письма  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
Чтобы заполнить таблицу, необходим INSERT.
20 авг 12, 17:58    [13038655]     Ответить | Цитировать Сообщить модератору
 Re: Помогите получить список дат.Код в тексте письма  [new]
ola_ya_22
Member

Откуда:
Сообщений: 251
pkarklin,
точно))))
большое спасибо))))
20 авг 12, 18:08    [13038721]     Ответить | Цитировать Сообщить модератору
 Re: Помогите получить список дат.Код в тексте письма  [new]
ola_ya_22
Member

Откуда:
Сообщений: 251
pkarklin,
а не подскажете формат какой-то чтобы дату типа 01.01.2005 переделать в январь 2005
20 авг 12, 18:12    [13038736]     Ответить | Цитировать Сообщить модератору
 Re: Помогите получить список дат.Код в тексте письма  [new]
SHok_by
Member

Откуда: Minsk
Сообщений: 51
Такого формата нет. Можешь посмотреть тут
Можно написать что то типо:
CASE MONTH(@D1) 
  WHEN 1 THEN 'Январь'
  WHEN 2 THEN 'Февраль'
  ...
  WHEN 12 THEN 'Декабрь' 
  END
  +' ' + YEAR(@D1)
20 авг 12, 18:59    [13039040]     Ответить | Цитировать Сообщить модератору
 Re: Помогите получить список дат.Код в тексте письма  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
календарь нынешнего месяца
Прочитайте до конца - там и для произвольного количества лет решение есть...
20 авг 12, 21:05    [13039518]     Ответить | Цитировать Сообщить модератору
 Re: Помогите получить список дат.Код в тексте письма  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
SHok_by
Такого формата нет. Можешь посмотреть тут
Можно написать что то типо:
CASE MONTH(@D1) 
  WHEN 1 THEN 'Январь'
  WHEN 2 THEN 'Февраль'
  ...
  WHEN 12 THEN 'Декабрь' 
  END
  +' ' + YEAR(@D1)
Можно ещё и так:
SET LANGUAGE русский;
SELECT DATENAME(MONTH, GETDATE());
20 авг 12, 21:08    [13039527]     Ответить | Цитировать Сообщить модератору
 Re: Помогите получить список дат.Код в тексте письма  [new]
ola_ya_22
Member

Откуда:
Сообщений: 251
iap,
declare @d1 date, @d2 date
set @d1='01.01.2005'
set @d2='01.01.2090'
while @d1<>@d2
begin
set @d1 =CASE MONTH(@D1) 
  WHEN 01 THEN 'Январь'
  WHEN 02 THEN 'Февраль'
  WHEN 03 THEN 'Март'
  WHEN 04 THEN 'Апрель'
  WHEN 05 THEN 'Май'
  WHEN 06 THEN 'Июнь'
  WHEN 07 THEN 'Июль'
  WHEN 08 THEN 'Август'
  WHEN 09 THEN 'Сентябрь'
  WHEN 10 THEN 'Октябрь'
  WHEN 11 THEN 'Ноябрь'
  WHEN 12 THEN 'Декабрь' 
  END
  +' ' + YEAR(@D1)
insert into [дата] ([дата]) values (@d1)  
set @d1=dateadd(MONTH,1,@d1)  
end

ошибка:Конфликт типов операндов: int несовместим с date

а мне важно чтобы поле [дата] оставалось текстовым.
помогите пожалуйста как это можно сделать...(((
22 авг 12, 10:19    [13047361]     Ответить | Цитировать Сообщить модератору
 Re: Помогите получить список дат.Код в тексте письма  [new]
Glory
Member

Откуда:
Сообщений: 104751
1. А что по-вашему будет при операции ' ' + YEAR(@D1) ?
Код пробела прибавится к году ? Или для года найдется символ с таким кодом ?

2. Вы думаете, что серве сам должен преобразовать например выражение 'Август'+' ' + YEAR(@D1) в тип date ?

3. Вы вообще понимаете, что делаете ?
22 авг 12, 10:24    [13047387]     Ответить | Цитировать Сообщить модератору
 Re: Помогите получить список дат.Код в тексте письма  [new]
SHok_by
Member

Откуда: Minsk
Сообщений: 51
http://msdn.microsoft.com/ru-ru/library/ms190309.aspx
22 авг 12, 10:34    [13047452]     Ответить | Цитировать Сообщить модератору
 Re: Помогите получить список дат.Код в тексте письма  [new]
SirMix
Member

Откуда: Киев
Сообщений: 79
DECLARE @T TABLE (D VARCHAR(10))
declare @d1 date, @d2 date
set @d1='20050101'
set @d2='20100301'
DECLARE @RetVal VARCHAR(10)
while @d1<>@d2
BEGIN
	
	SELECT @RetVal = CASE MONTH(@d1)
  WHEN 1 THEN 'Jan'
  WHEN 2 THEN 'Febr'
  WHEN 3 THEN 'Mar'
  WHEN 4 THEN 'Apr'
  WHEN 5 THEN 'May'
  WHEN 6 THEN 'Jun'
  WHEN 7 THEN 'Jul'
  WHEN 8 THEN 'Aug'
  WHEN 9 THEN 'Sep'
  WHEN 10 THEN 'Oct'
  WHEN 11 THEN 'Nov'
  WHEN 12 THEN 'Dec'
  END
  +' ' + CAST(YEAR(@D1) AS NVARCHAR)

insert into @T (D) values (@RetVal)

set @d1=dateadd(MONTH,1,@d1)
END
SELECT * FROM @T
22 авг 12, 10:41    [13047507]     Ответить | Цитировать Сообщить модератору
 Re: Помогите получить список дат.Код в тексте письма  [new]
user89
Member

Откуда:
Сообщений: 2083
ola_ya_22,

set language russian

declare @d1 date, @d2 date
select @d1 = '01.01.2005', @d2 = '01.01.2090'

select year(dateadd(mm, n.number, @d1)) [yy], month(dateadd(mm, n.number, @d1)) [mm],
datename(mm, dateadd(mm, n.number, @d2)) +' '+ cast(year(dateadd(mm, n.number, @d1)) as char(4)) [mname]
from master.dbo.spt_values n where type = 'P'
and n.number <= datediff(mm, @d1, @d2)
order by yy, mm

Колонки yy и mm нужны. Пригодится для сортировки и однозначного понимания, что "Август 2012" -> это месяц = 8 и год = 2012
22 авг 12, 10:42    [13047510]     Ответить | Цитировать Сообщить модератору
 Re: Помогите получить список дат.Код в тексте письма  [new]
Korwin_kor
Guest
 SELECT dt,
        to_char(dt, 'dd') day,
        to_char(dt, 'Month', 'nls_date_language=russian') month,
        to_char(dt, 'yyyy') year,
        to_char(dt, 'dd Month yyyy', 'nls_date_language=russian') FULL_date
   FROM (SELECT to_date('01-01-2012','dd.mm.yyyy')+LEVEL-1 dt 
           FROM dual 
         CONNECT BY to_date('01-01-2012','dd.mm.yyyy')+LEVEL-1<= to_date('31-12-2012','dd.mm.yyyy'));
19 ноя 12, 04:07    [13492645]     Ответить | Цитировать Сообщить модератору
 Re: Помогите получить список дат.Код в тексте письма  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31990
Korwin_kor
 SELECT dt,
        to_char(dt, 'dd') day,
        to_char(dt, 'Month', 'nls_date_language=russian') month,
        to_char(dt, 'yyyy') year,
        to_char(dt, 'dd Month yyyy', 'nls_date_language=russian') FULL_date
   FROM (SELECT to_date('01-01-2012','dd.mm.yyyy')+LEVEL-1 dt 
           FROM dual 
         CONNECT BY to_date('01-01-2012','dd.mm.yyyy')+LEVEL-1<= to_date('31-12-2012','dd.mm.yyyy'));
Что за спамер с кривым кодом!
19 ноя 12, 09:03    [13492856]     Ответить | Цитировать Сообщить модератору
 Re: Помогите получить список дат.Код в тексте письма  [new]
Добрый Э - Эх
Guest
alexeyvg
Что за спамер с кривым кодом!
Код прямой, просто он заточен не под эту СУБД.
19 ноя 12, 09:07    [13492868]     Ответить | Цитировать Сообщить модератору
 Re: Помогите получить список дат.Код в тексте письма  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Добрый Э - Эх
alexeyvg
Что за спамер с кривым кодом!
Код прямой, просто он заточен не под эту СУБД.
Значит. кривой!
19 ноя 12, 09:24    [13492918]     Ответить | Цитировать Сообщить модератору
 Re: Помогите получить список дат.Код в тексте письма  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31990
Добрый Э - Эх
alexeyvg
Что за спамер с кривым кодом!
Код прямой, просто он заточен не под эту СУБД.
Вот и получается - кривой :-)

Тем более копия кода в нескольких постах, и без каких либо коииентариев. Похоже, это первый опыт программирования, и автор захотел поделиться радостью со всем миром :-)

Кроме того, такой код кривой и для оракла тоже.
В сиквеле тоже можно написать CONNECT BY (только синтаксис другой), но это же не значит, что так писать правильно. Правильный подход уже был озвучен во всех темах по получению списка дат - сделать таблицу-календарь.
19 ноя 12, 09:32    [13492931]     Ответить | Цитировать Сообщить модератору
 Re: Помогите получить список дат.Код в тексте письма  [new]
Добрый Э - Эх
Guest
alexeyvg
Кроме того, такой код кривой и для оракла тоже.
...
Правильный подход - сделать таблицу-календарь.
В оракле этот код вполне себе рабочий.
А таблица-календарь - не панацея. На все случаи жизни костылей не наделаешь. Сегодня нужно сгенерировать диапазон дат с шагом "день", завтра с шагом "час", послезавтра - "минута" или "секунда". Не будешь же под каждый чих плодить объекты в базе?
Так что, иногда вполне востребовано генерирование данных "на лету"

В остальном - согласен. Человек зачем-то поднял древние посты на всех ветках форума и запостил туда практически один и тот же кусок ораклового кода...
19 ноя 12, 09:41    [13492952]     Ответить | Цитировать Сообщить модератору
 Re: Помогите получить список дат.Код в тексте письма  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31990
Добрый Э - Эх
В оракле этот код вполне себе рабочий.
В сиквеле такой же код с рекурсивным CTE тоже будет "вполне рабочий". Только что вы под этим понимаете - что он падать не будет???
Добрый Э - Эх
А таблица-календарь - не панацея. На все случаи жизни костылей не наделаешь. Сегодня нужно сгенерировать диапазон дат с шагом "день", завтра с шагом "час", послезавтра - "минута" или "секунда". Не будешь же под каждый чих плодить объекты в базе?
Так что, иногда вполне востребовано генерирование данных "на лету"
Так и не нужно делать костыли на все случаи. Этот код - костыль.

В РСУБД нужно получить исходные множества, вычислить пересечения, объединить, соединить, ..., ..., и получить результат.

А в запросах делать цикл по датам (понятно, что рекурсивный CTE или CONNECT BY - это просто тупой цикл) и высчитывать даты (конечно, тут будет ещё куча кода, ведь нужно вычислить выходные - не хранить же их! - а потом убрать исключения из таблицы исключений) - вот это вот и есть костыли для РСУБД, это очень некрасиво и просто противно для настоящего DB - программиста :-)
19 ноя 12, 09:52    [13492991]     Ответить | Цитировать Сообщить модератору
 Re: Помогите получить список дат.Код в тексте письма  [new]
Добрый Э - Эх
Guest
alexeyvg
В РСУБД нужно получить исходные множества, вычислить пересечения, объединить, соединить, ..., ..., и получить результат.

А в запросах делать цикл по датам (понятно, что рекурсивный CTE или CONNECT BY - это просто тупой цикл) и высчитывать даты (конечно, тут будет ещё куча кода, ведь нужно вычислить выходные - не хранить же их! - а потом убрать исключения из таблицы исключений) - вот это вот и есть костыли для РСУБД, это очень некрасиво и просто противно для настоящего DB - программиста :-)
В теории, конечно, всё красиво и правильно. А на практике зачастую выходит так, что сгенерировать 1 млн. записей "на лету" - гораздо легче и быстрее (в плане ресурсов сервера), чем извлечь тот же миллион из таблицы.

В целом - спор бессмысленный, конечно же. Во всем нужна золотая середина. А категоричность и приверженность крайностей - действительно "очень некрасиво и просто противно для настоящего DB - программиста"© ;-)
19 ноя 12, 10:17    [13493071]     Ответить | Цитировать Сообщить модератору
 Re: Помогите получить список дат.Код в тексте письма  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31990
Добрый Э - Эх
В теории, конечно, всё красиво и правильно. А на практике зачастую выходит так, что сгенерировать 1 млн. записей "на лету" - гораздо легче и быстрее (в плане ресурсов сервера), чем извлечь тот же миллион из таблицы.
Ну не знаю. Как это - "извлечь быстрее чем прочитать", тем более если такие запросы нередкие и извлекать нужно из памяти - просто выдать из памяти массив данных?

Может, и можно такие примеры придумать, но уж к данному случаю, календарю-то как это относится?
19 ноя 12, 10:33    [13493115]     Ответить | Цитировать Сообщить модератору
 Re: Помогите получить список дат.Код в тексте письма  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31990
alexeyvg
Как это - "извлечь быстрее чем прочитать"
Описка - "сгенерировать быстрее чсем прочитать".
19 ноя 12, 10:39    [13493131]     Ответить | Цитировать Сообщить модератору
 Re: Помогите получить список дат.Код в тексте письма  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Добрый Э - Эх
Человек зачем-то поднял древние посты на всех ветках форума и запостил туда практически один и тот же кусок ораклового кода...
По-моему, это сделал не человек.
19 ноя 12, 11:04    [13493249]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить