lebeda: (Default)
[personal profile] lebeda
люди поможите... торможу
под катом текст sql


SELECT
([Amount])

,[Contents],StartTime,EndTime

FROM [MinAs].[dbo].[ACCUM]
where (CONVERT(char(8),StartTime,112) >= '20100622'
and CONVERT(char(8),EndTime,112)<= '20100623')
and (substring(CONVERT (char(8), StartTime, 108),1,5)>= '07:00'
and substring(CONVERT (char(8), endTime, 108),1,5)<= '19:00')
and Contents='110'


есть StartTime число+время начала и EndTime число+время окончания.
надо узнать количество записанное в Amount
с 22/6/10 до 23/6/10
и только в утренние часы 7:00 до 19:00.

однако когда я вот так пишу, получаю данные и ночные тоже. че делать?
(deleted comment)

Date: 2010-06-27 02:21 pm (UTC)
From: [identity profile] lebeda.livejournal.com
можно на ты? незнаю я в чем дело, вопрос или логика правильная?

Date: 2010-06-27 02:24 pm (UTC)
From: [identity profile] ptfenix.livejournal.com
Да странно. Я проверила как раз сравнение строк, которые у тебя получаются. Вроде нормально... И логика...
приведи пример неправильной записи, которая у тебя получается, хотя не должна: мне нужно ее старттайм и ендтайм

Date: 2010-06-27 02:25 pm (UTC)
From: [identity profile] ptfenix.livejournal.com
И ваще :)
Не было еще такого сиквела, чтоб его не задрессировали :) Не боись.
From: [identity profile] ptfenix.livejournal.com
Все правильно, ошибка в логике :)
01.01 МЕНЬШЕ 19:00, то есть, позднее время окончания выглядит как раннее. А 21.10 - БОЛЬШЕ 7 утра.

Попробуйте вот так:

declare @start datetime
declare @end datetime

set @start = '2010-06-22 21:10:00'
set @end = '2010-06-23 01:01:00'


select
CONVERT(char(8),@start,112),
CONVERT(char(8),@end,112),
substring(CONVERT (char(8), @start, 108),1,5),
substring(CONVERT (char(8), @end, 108),1,5),
case when
((@start between '2010-06-22 07:00:00' and '2010-06-22 19:00:00')
and
(@end between '2010-06-22 07:00:00' and '2010-06-22 19:00:00'))
or
((@start between '2010-06-23 07:00:00' and '2010-06-22 19:00:00')
and
(@end between '2010-06-23 07:00:00' and '2010-06-22 19:00:00'))
then 1 else 0 end


не подойдет?
From: [identity profile] lebeda.livejournal.com
во первых спасибо за помощь!
во вторых затея очень хорошая, но дело в том, что мне нужна неделя.
причем неделя утро, неделя вечер. очень не хочется на 30 дней писать кейсы...
From: [identity profile] ptfenix.livejournal.com
Вот я поэтому и спросила насчет более общих дат. :)
Точнее можете рассказать? Какая именно неделя утро? Например, с какой даты начиная? Потом: период должен ПОЛНОСТЬЮ укладываться в дневные (или утренние) часы, или только начинаться там? судя по тому, что есть дата енд - полностью, да?

Я готова нарисовать это в общем виде :))
From: [identity profile] lebeda.livejournal.com
ох, если честно, дело такое..

люди работают в две смены по 12 часов. утро с 7 до 19, вечер с 19 до 7. и каждую неделю смены меняются. те кто работал утром переходят на вечер и наоборот.
Amount собирает продукцию.
мне говорят, скажи дорогая лебеда, сколько Contents 110 ппроизвела одна смена за месяц и сколько вторая.
и не забудь лебеда, что первая смена если так считать это та которая первого числа работала утром до субботы, с воскресенья вышла во вторую смену до субботы, в воскресенье следующей недели вышла опять с утра.. и так до конца месяца.
допустим по неделям, чтобы не открывать америку, я бы сама записала.. ибо там с днями недели заморачиваться.. но внутри недели хотелось бы все сразу..
From: [identity profile] ptfenix.livejournal.com
Если нужно более общее обращение с датами, можно поиграть с обработкой по типу "часть даты". Свистните, я с удовольствием.

Date: 2010-06-28 06:43 am (UTC)
From: [identity profile] ptfenix.livejournal.com
create FUNCTION dbo.fn_12hours_match
(
@group tinyint, @start datetime, @end datetime
)
-- group 0 - first week morning
--group 1 - first week EVENING


RETURNS bit
AS
BEGIN
declare
@ret bit,
@night_group bit,
@week_from tinyint,
@first_day datetime,
@morning_b datetime ,
@evening_b datetime ,
@start_date datetime,
@start_time datetime,
@end_date datetime,
@end_time datetime

if datediff(hh,@start,@end) > 12
begin
set @ret = 0
return @ret
end
set @morning_b = '1900-01-01 07:00:00'
set @evening_b = '1900-01-01 19:00:00'
set @first_day = '2010-06-01'

set @start_date = convert(datetime, convert (varchar(30), @start, 101))
set @end_date = convert(datetime, convert (varchar(30), @end, 101))
set @start_time = convert(datetime, convert (varchar(30), @start, 108))
set @end_time = convert(datetime, convert (varchar(30), @end, 108))

if @start_time < @morning_b or @start_time > @evening_b
set @start_date = dateadd(d,-1,@start_date)

if @end_time < @morning_b or @end_time > @evening_b
set @end_time = dateadd(d,-1,@end_date)

set @week_from = datediff(wk,@first_day,@start_date) +1
select @night_group = case when (@week_from %2) = @group then 1 else 0 end


if @night_group = 0
begin
if @start_time < @morning_b or @start_time > @evening_b
begin
set @ret = 0
return @ret
end
if @end_time < @morning_b or @end_time > @evening_b
begin
set @ret = 0
return @ret
end
end
else
begin
if @start_time between @morning_b and @evening_b
begin
set @ret = 0
return @ret
end
if @end_time between @morning_b and @evening_b
begin
set @ret = 0
return @ret
end
end
set @ret = 1
return @ret

END

----------------------------------------------------
вызов:

SELECT
([Amount])

,[Contents],StartTime,EndTime

FROM [MinAs].[dbo].[ACCUM]
where Contents='110' and dbo.fn_12hours_match(>group 0 or 1<, StartTime,EndTime) = 1

-----------------------------

проверяй :)




Edited Date: 2010-06-28 06:44 am (UTC)

Date: 2010-06-28 06:47 am (UTC)
From: [identity profile] ptfenix.livejournal.com
Это абсолютно общий случай, для любого дня любой группы любой недели. У меня "день старта" задан 1 июня, но он может быть любым, и он является первым днем первой недели. Также и время начала-конца смены. Все это можно не держать хардкодед, а положить в таблицу или передавать как дополнительные параметры. Разница в вызове функции для "сначала дневной и "сначала ночной" группы - только в первом параметре, для первой он 0, для второй = 1.

Date: 2010-06-28 06:54 am (UTC)
From: [identity profile] lebeda.livejournal.com
Msg 262, Level 14, State 1, Procedure fn_12hours_match, Line 74
CREATE FUNCTION permission denied in database 'master'.

Date: 2010-06-28 07:04 am (UTC)
From: [identity profile] ptfenix.livejournal.com
Ой-вей :(
Это значит, что у тебя нет аршаот создавать функции. ДиБиЭя попроси ее сделать. Или попроси аршаот. :((( Тут я бессилен. Зато удобная :) На все твои случаи жизни.

Date: 2010-06-28 07:05 am (UTC)
From: [identity profile] ptfenix.livejournal.com
Да, а почему ты в мастере ее делаешь? Ты в какой базе гуляешь? Может быть, там есть право делать функции?

Date: 2010-06-28 07:21 am (UTC)
From: [identity profile] lebeda.livejournal.com
они мне закрыли доступ для создания.. полько простые селекты.
я попрошу.. или переделаю твою функцию в простой селект.. там по идее не должно быть сложно, а?

Date: 2010-06-28 07:26 am (UTC)
From: [identity profile] ptfenix.livejournal.com
Не, не выйдет. :(((
Я потому и спрашивала про функцию, можно ли. Попроси, пусть создадут.

Не создавай в мастере! Меня это смущает. Обычно функции создаются в собственной базе. Ты проверь, может быть, там тебе можно...

Date: 2010-06-28 07:28 am (UTC)
From: [identity profile] lebeda.livejournal.com
я проверила, низзя

Date: 2010-06-28 07:41 am (UTC)
From: [identity profile] lebeda.livejournal.com
не училас никогда писать функции на sql. у тебя круто получается :)
если сравнивать с С,
ты возращаешь на каждую строчку 1 или 0, да? и если 1 то строчка берется в расчет..
в любом случае я вычленю твой текст и синтаксис и стану умнее благодаря тебе :)

Date: 2010-06-28 07:47 am (UTC)
From: [identity profile] ptfenix.livejournal.com

ну, в этом и смысЕл функций :)
Гораздо гибче отбор, потому что позволяет нормальное программирование внутри функции, преобразование типов в любом количестве, коррекция данных и тэ пэ :)

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

Жалко, если не пригодится... Ну что поделать :))
From: [identity profile] lebeda.livejournal.com
все равно у меня еще две базы лежат ( sapb1 и mes)в полностью моем распоряжении
хоть на них смогу чего нибудь интересное делать:)

Date: 2010-06-28 07:28 am (UTC)
From: [identity profile] lebeda.livejournal.com
у меня вот такая штучка получилась для утра, с помощью naumka

SELECT
([Amount])

,[Contents],StartTime,EndTime

FROM [MinAshplast].[dbo].[ACCUM]
where (CONVERT(char(8),StartTime,112) >= '20100620'
and CONVERT(char(8),EndTime,112)<= '20100626')
and (substring(CONVERT (char(8), StartTime, 108),1,5)>= '07:00'
and substring(CONVERT (char(8), endTime, 108),1,5)<= '19:00')
and Contents like 'm%'
and DAY(StartTime)=DAY(EndTime)

тобишь не хватало последнего тная and DAY(StartTime)=DAY(EndTime)
я щас попробую твою идею set @morning_b = '1900-01-01 07:00:00'
заграбастать и скомпилировать просто текст :)

и все замечательно
а вот на вечер не срабатывает :(

Date: 2010-06-28 07:35 am (UTC)
From: [identity profile] ptfenix.livejournal.com
Я думала про day
неудобно :(
именно из-за второй смены
я там накрутила на эту тему.... специально, чтобы эти суточные переходы не мешали

Date: 2010-06-28 07:46 am (UTC)
From: [identity profile] lebeda.livejournal.com
прости за мой убогий русский, я обычно слежу за речью и правописанием. от волнения перешла на кальку и грубые ошибки.

(no subject)

From: [identity profile] ptfenix.livejournal.com - Date: 2010-06-28 07:47 am (UTC) - Expand

(no subject)

From: [identity profile] lebeda.livejournal.com - Date: 2010-07-01 09:55 am (UTC) - Expand

(no subject)

From: [identity profile] ptfenix.livejournal.com - Date: 2010-07-01 01:06 pm (UTC) - Expand

(no subject)

From: [identity profile] lebeda.livejournal.com - Date: 2010-07-06 06:30 am (UTC) - Expand

(no subject)

From: [identity profile] ptfenix.livejournal.com - Date: 2010-07-06 07:00 am (UTC) - Expand

(no subject)

From: [identity profile] lebeda.livejournal.com - Date: 2010-07-06 08:52 am (UTC) - Expand

(no subject)

From: [identity profile] ptfenix.livejournal.com - Date: 2010-07-06 08:57 am (UTC) - Expand

(no subject)

From: [identity profile] lebeda.livejournal.com - Date: 2010-07-06 09:07 am (UTC) - Expand

(no subject)

From: [identity profile] ptfenix.livejournal.com - Date: 2010-07-06 09:21 am (UTC) - Expand

Date: 2010-06-28 06:47 am (UTC)
From: [identity profile] lebeda.livejournal.com
нифига себе сколько букв. я в экстазе. пошла смотреть что за чудеса. ат гдоля в любом случае :)

May 2012

S M T W T F S
  12345
6 7891011 12
13 141516171819
20212223242526
2728293031  

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jun. 23rd, 2025 09:58 am
Powered by Dreamwidth Studios
OSZAR »