VirtualIreland.ru - Виртуальная Ирландия
Вернуться   VirtualIreland.ru - Виртуальная Ирландия > Живем в Ирландии > IT и Связь

IT и Связь Обсуждение "айтишных" вопросов и средств связи

Ответ
 
Опции темы Опции просмотра
Старый 30.03.2010, 14:30   #1
Шрайбикус Модератор
 
Аватар для Andrew Shahoff
 
Сообщений: 7,983
Благодарности: 7,284 в 1,978 сообщениях Поиск благодарностей Andrew Shahoff
По умолчанию сикуель задачка #2

Привет ДиБиэЙщики! Нужен хелп.

Есть МССиквел 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/
Andrew Shahoff вне форума   Ответить с цитированием

Зарегистрируйтесь или войдите под своим именем, чтобы спрятать этот рекламный блок
Старый 30.03.2010, 15:11   #2
My name is Exaybachay
 
Аватар для KaraNagai
 
Откуда: Дублин, Ирландия
Сообщений: 21,481
Благодарности: 12,152 в 4,948 сообщениях Поиск благодарностей KaraNagai
По умолчанию Re: сикуель задачка #2

Цитата:
Сообщение от Andrew Shahoff Посмотреть сообщение
Есть идеи? Или хoтябы синтаксис $date - 1 month дайте плз
это функцие dateadd делается, если не ошибаюсь

последнее 25 число вычитанием из текущей даты 24 дней и дальнейшим делением результирующей даты на части и собиранием её года, месяца и цифирки 25 новой даты - как-то так.
остальное не понял, выборка нужна какая-то?
__________________
митьки никого не хотят победить
KaraNagai вне форума   Ответить с цитированием
Благодарность от:
Andrew Shahoff (30.03.2010)
Старый 30.03.2010, 17:03   #3
Шрайбикус Модератор
 
Аватар для Andrew Shahoff
 
Сообщений: 7,983
Благодарности: 7,284 в 1,978 сообщениях Поиск благодарностей Andrew Shahoff
По умолчанию Re: сикуель задачка #2

Получилось, но громоздко и некрасиво. Как в детские времена в бэйсике
Нужен хелп в оптимизации

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
Цитата:
Сообщение от KaraNagai Посмотреть сообщение
остальное не понял, выборка нужна какая-то?
С выборкой я пока сам
__________________
Снимаю, развожу | http://gallery.virtualireland.ru/v/Andrew+Shahoff/

Последний раз редактировалось Andrew Shahoff, 30.03.2010 в 17:07. Причина: Добавлено сообщение
Andrew Shahoff вне форума   Ответить с цитированием
Старый 30.03.2010, 17:31   #4
Спам-робот
 
Аватар для YellowMan
 
Откуда: Dublin<->Брянск
Сообщений: 21,268
Благодарности: 11,080 в 5,139 сообщениях Поиск благодарностей YellowMan
По умолчанию Re: сикуель задачка #2

Для таких дел в каждой базе полезно иметь табличку с датами от царя Гороха и до победы коммунизма.
Тогда будет красиво.
__________________
My Church is Black...
YellowMan вне форума   Ответить с цитированием
Благодарностей: 2 от:
Andrew Shahoff (30.03.2010), KaraNagai (31.03.2010)
Старый 30.03.2010, 19:25   #5
READ ONLY
 
Аватар для AlexL
 
Сообщений: 3,156
Благодарности: 1,856 в 929 сообщениях Поиск благодарностей AlexL
Отправить сообщение для  AlexL с помощью ICQ
По умолчанию Re: сикуель задачка #2

могу предложить свой алгоритм

-- эта секция для тестирования
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.
AlexL вне форума   Ответить с цитированием
Благодарность от:
Andrew Shahoff (30.03.2010)
Старый 31.03.2010, 08:01   #6
My name is Exaybachay
 
Аватар для KaraNagai
 
Откуда: Дублин, Ирландия
Сообщений: 21,481
Благодарности: 12,152 в 4,948 сообщениях Поиск благодарностей KaraNagai
По умолчанию Re: сикуель задачка #2

Цитата:
Сообщение от Andrew Shahoff Посмотреть сообщение
if @Test >= 25
Это зачем? Я же говорю - берёшь дату, вычитаешь 24 дня, разбиваешь на части, заменяешь в ней день месяца на чиселко 25 - и вперёд. Никаких ифов.

KaraNagai добавил 31.03.2010 в 09:03
Цитата:
Сообщение от YellowMan Посмотреть сообщение
Тогда будет красиво
Кстати да.
__________________
митьки никого не хотят победить

Последний раз редактировалось KaraNagai, 31.03.2010 в 08:03. Причина: Добавлено сообщение
KaraNagai вне форума   Ответить с цитированием
Старый 31.03.2010, 09:26   #7
Шрайбикус Модератор
 
Аватар для Andrew Shahoff
 
Сообщений: 7,983
Благодарности: 7,284 в 1,978 сообщениях Поиск благодарностей Andrew Shahoff
По умолчанию Re: сикуель задачка #2

Цитата:
Сообщение от KaraNagai Посмотреть сообщение
Это зачем? Я же говорю - берёшь дату, вычитаешь 24 дня, разбиваешь на части, заменяешь в ней день месяца на чиселко 25 - и вперёд. Никаких ифов.
Этот эксесайз получается длиннее, плюс надо менять тип данных, а так всё происходит в "datetime"
__________________
Снимаю, развожу | http://gallery.virtualireland.ru/v/Andrew+Shahoff/
Andrew Shahoff вне форума   Ответить с цитированием
Старый 31.03.2010, 09:47   #8
Спам-робот
 
Аватар для YellowMan
 
Откуда: Dublin<->Брянск
Сообщений: 21,268
Благодарности: 11,080 в 5,139 сообщениях Поиск благодарностей YellowMan
По умолчанию Re: сикуель задачка #2

самое простое что приходит на ум без таблички это вот так:

Цитата:
IF day(GETDATE())>=25
SELECT DATEADD(MONTH,DATEDIFF(MONTH,'19000125',GETDATE()) ,'19000125')
ELSE
SELECT DATEADD(MONTH,DATEDIFF(MONTH,'19000125',GETDATE())-1,'19000125')
Через CASE это можно и в условии написать.
Алгоритм основан на том что скуль умеет считать целыми месяцами
__________________
My Church is Black...
YellowMan вне форума   Ответить с цитированием
Старый 31.03.2010, 09:50   #9
My name is Exaybachay
 
Аватар для KaraNagai
 
Откуда: Дублин, Ирландия
Сообщений: 21,481
Благодарности: 12,152 в 4,948 сообщениях Поиск благодарностей KaraNagai
По умолчанию Re: сикуель задачка #2

Цитата:
тот эксесайз получается длиннее, плюс надо менять тип данных, а так всё происходит в "datetime"
да чего ж длиннее?

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. Причина: Добавлено сообщение
KaraNagai вне форума   Ответить с цитированием
Старый 31.03.2010, 10:03   #10
Спам-робот
 
Аватар для YellowMan
 
Откуда: Dublin<->Брянск
Сообщений: 21,268
Благодарности: 11,080 в 5,139 сообщениях Поиск благодарностей YellowMan
По умолчанию Re: сикуель задачка #2

Цитата:
Сообщение от KaraNagai Посмотреть сообщение
хехехе хадкорные программисты избегают циклов и ифов ))))
Хе-хе, зато судя по статистике мое примерно на 30% быстрее
__________________
My Church is Black...
YellowMan вне форума   Ответить с цитированием
Старый 31.03.2010, 10:17   #11
My name is Exaybachay
 
Аватар для KaraNagai
 
Откуда: Дублин, Ирландия
Сообщений: 21,481
Благодарности: 12,152 в 4,948 сообщениях Поиск благодарностей KaraNagai
По умолчанию Re: сикуель задачка #2

Цитата:
Хе-хе, зато судя по статистике мое примерно на 30% быстрее
не очень понятно с какого хрена. Видимо из-за того что я переменные использовал. проверь вот что:

select dateadd(day, 25-day(dateadd(day, -24, getdate())), dateadd(day, -24, getdate()))

блин, лисп какой-то, а не сиквел хехехе
__________________
митьки никого не хотят победить
KaraNagai вне форума   Ответить с цитированием
Старый 31.03.2010, 10:26   #12
Спам-робот
 
Аватар для YellowMan
 
Откуда: Dublin<->Брянск
Сообщений: 21,268
Благодарности: 11,080 в 5,139 сообщениях Поиск благодарностей YellowMan
По умолчанию Re: сикуель задачка #2

Я так и проверил.
Получается что у тебя всегда - 3 dateadd, 1 day
У меня - 1 dateadd, 1 datediff, 1 day, 1 if

Есть подозрение что dateadd тут - самая тяжелая функция, if -самая легкая а datediff не сильно отличается от if потомоу что даты все равно храняться как целая разница в миллисекундах.
__________________
My Church is Black...
YellowMan вне форума   Ответить с цитированием
Старый 31.03.2010, 10:37   #13
My name is Exaybachay
 
Аватар для KaraNagai
 
Откуда: Дублин, Ирландия
Сообщений: 21,481
Благодарности: 12,152 в 4,948 сообщениях Поиск благодарностей KaraNagai
По умолчанию Re: сикуель задачка #2

Возможно. Но моё мне всё равно больше нравится Красота иногда требует таких вот малосущественных жертв, я считаю )
__________________
митьки никого не хотят победить
KaraNagai вне форума   Ответить с цитированием

Зарегистрируйтесь или войдите под своим именем, чтобы спрятать этот рекламный блок
Старый 31.03.2010, 11:09   #14
Шрайбикус Модератор
 
Аватар для Andrew Shahoff
 
Сообщений: 7,983
Благодарности: 7,284 в 1,978 сообщениях Поиск благодарностей Andrew Shahoff
По умолчанию Re: сикуель задачка #2

Спасибо друзья за варианты, потом протестирую на самый малоресурсный
Теперь продолжение банкета

Делаю выборку между датами. По одному полю. В поле просто числа numeric(28,2).
Делаю сортировку по убыванию. Как узнать сколько записей считалось и как выбрать запись с нужным номером?
__________________
Снимаю, развожу | http://gallery.virtualireland.ru/v/Andrew+Shahoff/
Andrew Shahoff вне форума   Ответить с цитированием
Старый 31.03.2010, 12:49   #15
Спам-робот
 
Аватар для YellowMan
 
Откуда: Dublin<->Брянск
Сообщений: 21,268
Благодарности: 11,080 в 5,139 сообщениях Поиск благодарностей YellowMan
По умолчанию Re: сикуель задачка #2

select @@rowcount сразу после селекта.

что такое запись с нужным номером?
__________________
My Church is Black...
YellowMan вне форума   Ответить с цитированием
Ответ



Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать на сообщения
Вы не можете добавлять вложения
Вы не можете редактировать свои сообщения

BB код Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщ.
сикуель задачка 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


Часовой пояс GMT, времени сейчас: 01:20.


vBulletin®, Copyright ©2000-2025, Jelsoft Enterprises Ltd., Русификация: zCarot, Vovan & Co
©2003-2025 VirtualIreland.ru - Виртуальная Ирландия