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.

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

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
прости за мой убогий русский, я обычно слежу за речью и правописанием. от волнения перешла на кальку и грубые ошибки.

Date: 2010-06-28 07:47 am (UTC)
From: [identity profile] ptfenix.livejournal.com
да ну :)
я не заметила

Date: 2010-07-01 09:55 am (UTC)
From: [identity profile] lebeda.livejournal.com
птичка, дорогая, передала твою функцию человекам которые писали программу сбора данных, они сказали что ты крута :)
обещали записать функцию в мою базу.. надеюсь скоро буду тестить :)))

Date: 2010-07-06 06:30 am (UTC)
From: [identity profile] lebeda.livejournal.com
сонц, функция меня не взлюбила, всегда возращает 0.
скажи пожалуйста, первый тнай
if datediff(hh,@start,@end) > 12
begin
set @ret = 0
return @ret

он для чего? я проверила через селект, получается при запросе:
----------
SELECT
([Amount])

,[Contents],StartTime,EndTime,
datediff(hh,'2010-06-01 07:00','2010-07-01 07:00') as xx

FROM [MinAs].[dbo].[ACCUM]
where Contents='110'

----------

в xx он возращает 720 всем строкам
воть:(

Date: 2010-07-06 07:00 am (UTC)
From: [identity profile] ptfenix.livejournal.com
Вообще, это проверка, не прошло ли между стартом и финишем БОЛЬШЕ ОДНОЙ СМЕНЫ. (более 12 часов)
Если да, функция и должна возвращать ноль - нужно ведь, чтобы деталь делалась в течение какой-то одной смены от начала до конца...

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

Date: 2010-07-06 08:57 am (UTC)
From: [identity profile] ptfenix.livejournal.com
Почему? Это начало и конец из таблицы, то, что ты мне показала в Екселе... Старт тайм операции и енд тайм операции...


Не напрягаешь :)
Я это люблю.

Date: 2010-07-06 09:07 am (UTC)
From: [identity profile] lebeda.livejournal.com
я тебя обожаю :)
когда я пишу запрос
SELECT
([Amount])

,[Contents],StartTime,EndTime

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

я только группу меняю или 1 или 0?
а как тогда он знает за какой период времени меня интересуют тоцаот?

Date: 2010-07-06 09:21 am (UTC)
From: [identity profile] ptfenix.livejournal.com
ТОлько группу :)
Он умный. Он знает, сколько недель прошло с момента начала периода (там в теле функции есть дата начала периода, ее можно задать таблично, например)
Поэтому если группа 0, то он воспринимает ее как ту, что ПЕРВУЮ неделю работала в утро (сталбыть, и третью, и пятую...), а если один - то наоборот. :)
From: [identity profile] ptfenix.livejournal.com
set @first_day = '2010-06-01'

Эту переменную можно записать не хардкодед, а в таблицу или параметром передать (тогда дополнительным, четвертым)
From: [identity profile] lebeda.livejournal.com
а конец? я например сегодня делаю подсчет за прошлый месяц, мне низзя до сегодня, мне надо до 1.7
From: [identity profile] ptfenix.livejournal.com
Ну так отбери те, у кого енд-дэйт до первого июля :)
В основном селекте отбери. Вне функции. Почему так нельзя?

Почему так нельзя?

Date: 2010-07-06 09:45 am (UTC)
From: [identity profile] lebeda.livejournal.com
можно :) я когда в панике мало того что туплю, я вообще отключаюсь.
From: [identity profile] ptfenix.livejournal.com
Понимаешь, @first_day - это НЕ НАЧАЛО ПЕРИОДА, за который ты хочешь считать. Период ты сама назначь, простыми датами в селекте. @first_day - это дата, С КОТОРОЙ НАЧИНАЕТСЯ СЧЕТ НЕДЕЛЬ. Она может быть 3 года назад, например. Если счет недель с тех пор так и шел: утро-вечер, утро-вечер...

error

Date: 2010-07-06 09:41 am (UTC)
From: [identity profile] lebeda.livejournal.com
Msg 220, Level 16, State 2, Line 3
Arithmetic overflow error for data type tinyint, value = -155.

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


SELECT Amount,Contents,StartTime,EndTime
FROM ACCUM
where Contents='110' and dbo.fn_12hours_match(1,StartTime,EndTime) = 1
order by EndTime desc

Re: error

Date: 2010-07-06 09:48 am (UTC)
From: [identity profile] ptfenix.livejournal.com
Какие значение старт тайм и енд тайм ты посылала?

Вообще, конечно, для страховки надо @week_from tinyint, измени на smallint. Тогда хотя бы падать не будет при неправильных параметрах :)


Re: error

Date: 2010-07-06 09:50 am (UTC)
From: [identity profile] ptfenix.livejournal.com
1. @first_day должно быть меньше СтартТайм.
2. Старт тайм должен быть меньше-равен ЕндТайм.
From: [identity profile] lebeda.livejournal.com

SELECT [LineID],Amount,Contents,StartTime,EndTime
FROM [ACCUM]
where Contents like 'm%'and dbo.fn_12hours_match(0,StartTime,EndTime) = 1
and StartTime>='2007-06-01 07:00'
and EndTime<='2007-07-01 07:00'
----------------------------------
меняю 0 на 1
получаю больше строк, но первая всегда одинаковая и многие наверное тоже.

-----------
Line06 66.837 m323 2007-06-04 10:56:58.453 2007-06-04 11:12:38.377
Line06 13.84 m323 2007-06-04 10:57:31.937 2007-06-04 11:12:38.377
Line06 95.572 m323 2007-06-04 11:12:38.377 2007-06-04 11:35:32.577
Line06 18.743 m323 2007-06-04 11:12:38.377 2007-06-04 11:35:32.577
-------------------------------


SELECT [LineID],Amount,Contents,StartTime,EndTime
FROM [ACCUM]
where Contents like 'm%'and dbo.fn_12hours_match(1,StartTime,EndTime) = 1
and StartTime>='2007-06-01 07:00'
and EndTime<='2007-07-01 07:00'
-----------------
Line06 66.837 m323 2007-06-04 10:56:58.453 2007-06-04 11:12:38.377
Line06 13.84 m323 2007-06-04 10:57:31.937 2007-06-04 11:12:38.377
Line06 95.572 m323 2007-06-04 11:12:38.377 2007-06-04 11:35:32.577
Line06 18.743 m323 2007-06-04 11:12:38.377 2007-06-04 11:35:32.577
Line06 85.599 m323 2007-06-04 11:35:32.577 2007-06-04 15:27:23.173

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

USE [MinAshplast]
GO
/****** Object: UserDefinedFunction [dbo].[fn_12hours_match] Script Date: 07/06/2010 14:03:41 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER 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 smallint,
@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-05-30'

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
------------------------

уф.. :(
From: [identity profile] ptfenix.livejournal.com
Фест дэй в теле функции - 2010 год. А ты собираешь данные за 2007... :(((
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 03:31 pm
Powered by Dreamwidth Studios
OSZAR »