![]() |
|
IT и Связь Обсуждение "айтишных" вопросов и средств связи |
![]() |
|
Опции темы | Опции просмотра |
![]() |
#1 |
Шрайбикус Модератор
|
![]()
Привет ДиБиэЙщики! Нужен хелп.
Есть МССиквел 2008 делаю выборку из базы где есть тэйбл таймстэмп в формате Datetime между датами. Так вот с датами проблема. Хочу иметь два набора дат. Первый набор: Последнее 25тое число и сегодняшнее число Второй набор: Последнее 25тое число и 25тое число месяц назад от последнего 25го. Примера №1. Сегодня 30марта. Последнее 25тое это было 25 марта , минус месяц это было 25тое февраля. Примера №2. Сегодня 15тое января 2010 года. Последнее 25тое было 25 декабря 2009. Месяц назад и имеем 25 ноября 2009. Есть идеи? Или хoтябы синтаксис $date - 1 month дайте плз ![]()
__________________
Снимаю, развожу | http://gallery.virtualireland.ru/v/Andrew+Shahoff/ |
![]() |
![]() |
Зарегистрируйтесь или войдите под своим именем, чтобы спрятать этот рекламный блок |
![]() |
#2 |
My name is Exaybachay
|
![]()
это функцие dateadd делается, если не ошибаюсь
последнее 25 число вычитанием из текущей даты 24 дней и дальнейшим делением результирующей даты на части и собиранием её года, месяца и цифирки 25 новой даты - как-то так. остальное не понял, выборка нужна какая-то?
__________________
митьки никого не хотят победить |
![]() |
![]() |
Благодарность от: | Andrew Shahoff (30.03.2010) |
![]() |
#3 |
Шрайбикус Модератор
|
![]()
Получилось, но громоздко и некрасиво. Как в детские времена в бэйсике
Нужен хелп в оптимизации ![]() declare @Olddate datetime declare @LastDate datetime declare @CurrentDate datetime DECLARE @Test int declare @Temp int DECLARE @TempTime datetime set @CurrentDate= GETDATE() set @Test = datepart ( day, @CurrentDate) set @Temp = DATEDIFF (day,0, @Currentdate) set @TempTime = dateadd (DAY,@Temp,0) if @Test >= 25 begin set @Test = @Test - 25 set @LastDate = DATEADD(DAY, (-1) * @Test, @TempTime ) set @Olddate = DATEADD (month, (-1), @Lastdate) end Else begin set @TempTime = DATEadd(MONTH, (-1) , @CurrentDate) set @Test = 25 - (datepart ( day, @TempTime)) set @LastDate = DATEADD (day, @Test,@TempTime) set @Temp = DATEDIFF (day,0,@LastDate) set @LastDate = DATEADD (DAY, @Temp,0) set @Olddate = DATEADD (month, (-1), @Lastdate) end select @CurrentDate select @LastDate select @Olddate Andrew Shahoff добавил 30.03.2010 в 18:07 С выборкой я пока сам ![]()
__________________
Снимаю, развожу | http://gallery.virtualireland.ru/v/Andrew+Shahoff/ Последний раз редактировалось Andrew Shahoff, 30.03.2010 в 17:07. Причина: Добавлено сообщение |
![]() |
![]() |
![]() |
#4 |
Спам-робот
|
![]()
Для таких дел в каждой базе полезно иметь табличку с датами от царя Гороха и до победы коммунизма.
Тогда будет красиво.
__________________
My Church is Black... |
![]() |
![]() |
Благодарностей: 2 от: | Andrew Shahoff (30.03.2010), KaraNagai (31.03.2010) |
![]() |
#5 |
READ ONLY
|
![]()
могу предложить свой алгоритм
-- эта секция для тестирования declare @current_date datetime set @current_date = getdate() - 1 -- select @current_date [current_date] ,case ceiling ( datepart (dd, @current_date ) / 25) -- 0 - less than 25, 1 - over 25 when 0 -- 0 - less than 25 then dateadd(mm,-1, dateadd(dd, 25 - ( datepart (dd, @current_date ) % 25), @current_date )) when 1 -- 1 - over 25 then dateadd(dd, -( datepart (dd, @current_date ) % 25), @current_date ) end last_25_date алгоритм основан на вычислении кол-ва дней между текущей датой и 25 числом текущего месяца, использую операцию остаток от деления. для того чтобы узнать знак разницы дней используется операция целочисленного округления. или громоздко, но в одну строчку declare @current_date datetime set @current_date = getdate() select @current_date [current_date] ,dateadd(mm,ceiling ( datepart (dd, @current_date ) / 25 )-1, dateadd(dd, 25 *(1-ceiling ( datepart (dd, @current_date ) / 25 )) - ( datepart (dd, @current_date ) % 25 ), @current_date )) last_day_date
__________________
Хотели всё и сразу, а получили ничего и надолго. [url=http://www.visited.ru][img]http://www.visited.ru/flagmap.php?visited=ATBEBGCZFRDEIEITMTNLRUESUKVATR[/img][/url] Последний раз редактировалось AlexL, 30.03.2010 в 19:56. |
![]() |
![]() |
Благодарность от: | Andrew Shahoff (30.03.2010) |
![]() |
#6 |
My name is Exaybachay
|
![]()
Это зачем? Я же говорю - берёшь дату, вычитаешь 24 дня, разбиваешь на части, заменяешь в ней день месяца на чиселко 25 - и вперёд. Никаких ифов.
KaraNagai добавил 31.03.2010 в 09:03 Кстати да.
__________________
митьки никого не хотят победить Последний раз редактировалось KaraNagai, 31.03.2010 в 08:03. Причина: Добавлено сообщение |
![]() |
![]() |
![]() |
#7 |
Шрайбикус Модератор
|
![]()
Этот эксесайз получается длиннее, плюс надо менять тип данных, а так всё происходит в "datetime"
__________________
Снимаю, развожу | http://gallery.virtualireland.ru/v/Andrew+Shahoff/ |
![]() |
![]() |
![]() |
#8 | |
Спам-робот
|
![]()
самое простое что приходит на ум без таблички это вот так:
Цитата:
Алгоритм основан на том что скуль умеет считать целыми месяцами ![]()
__________________
My Church is Black... |
|
![]() |
![]() |
![]() |
#9 | |
My name is Exaybachay
|
![]() Цитата:
declare @res as datetime set @res = dateadd(day, -24, getdate()) set @res = dateadd(day, 25-day(@res), @res) select @res или у меня глюки? KaraNagai добавил 31.03.2010 в 10:51 хехехе хадкорные программисты избегают циклов и ифов ![]()
__________________
митьки никого не хотят победить Последний раз редактировалось KaraNagai, 31.03.2010 в 09:51. Причина: Добавлено сообщение |
|
![]() |
![]() |
![]() |
#10 |
Спам-робот
|
![]()
Хе-хе, зато судя по статистике мое примерно на 30% быстрее
![]()
__________________
My Church is Black... |
![]() |
![]() |
![]() |
#11 | |
My name is Exaybachay
|
![]() Цитата:
select dateadd(day, 25-day(dateadd(day, -24, getdate())), dateadd(day, -24, getdate())) блин, лисп какой-то, а не сиквел хехехе
__________________
митьки никого не хотят победить |
|
![]() |
![]() |
![]() |
#12 |
Спам-робот
|
![]()
Я так и проверил.
Получается что у тебя всегда - 3 dateadd, 1 day У меня - 1 dateadd, 1 datediff, 1 day, 1 if Есть подозрение что dateadd тут - самая тяжелая функция, if -самая легкая а datediff не сильно отличается от if потомоу что даты все равно храняться как целая разница в миллисекундах.
__________________
My Church is Black... |
![]() |
![]() |
![]() |
#13 |
My name is Exaybachay
|
![]()
Возможно. Но моё мне всё равно больше нравится
![]() ![]()
__________________
митьки никого не хотят победить |
![]() |
![]() |
Зарегистрируйтесь или войдите под своим именем, чтобы спрятать этот рекламный блок |
![]() |
#14 |
Шрайбикус Модератор
|
![]()
Спасибо друзья за варианты, потом протестирую на самый малоресурсный
![]() Теперь продолжение банкета ![]() Делаю выборку между датами. По одному полю. В поле просто числа numeric(28,2). Делаю сортировку по убыванию. Как узнать сколько записей считалось и как выбрать запись с нужным номером?
__________________
Снимаю, развожу | http://gallery.virtualireland.ru/v/Andrew+Shahoff/ |
![]() |
![]() |
![]() |
|
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщ. |
сикуель задачка | dzher | IT и Связь | 173 | 23.02.2011 10:22 |
Задачка. | Sleepwalker | Само приползло | 5 | 09.02.2009 12:21 |
Задачка для программистов | Mishka Na Servere | IT и Связь | 150 | 09.12.2008 11:52 |
Задачка для дитёв... | Arte | Само приползло | 13 | 18.09.2007 13:39 |
Задачка про собачку | Наталия | Общие темы | 41 | 14.10.2003 12:42 |