числа и время
Jun. 27th, 2010 04:43 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
люди поможите... торможу
под катом текст 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.
однако когда я вот так пишу, получаю данные и ночные тоже. че делать?
под катом текст 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.
однако когда я вот так пишу, получаю данные и ночные тоже. че делать?
no subject
Date: 2010-06-28 07:28 am (UTC)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'
заграбастать и скомпилировать просто текст :)
и все замечательно
а вот на вечер не срабатывает :(
no subject
Date: 2010-06-28 07:35 am (UTC)неудобно :(
именно из-за второй смены
я там накрутила на эту тему.... специально, чтобы эти суточные переходы не мешали
no subject
Date: 2010-06-28 07:46 am (UTC)no subject
Date: 2010-06-28 07:47 am (UTC)я не заметила
no subject
Date: 2010-07-01 09:55 am (UTC)обещали записать функцию в мою базу.. надеюсь скоро буду тестить :)))
no subject
Date: 2010-07-01 01:06 pm (UTC)no subject
Date: 2010-07-06 06:30 am (UTC)скажи пожалуйста, первый тнай
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 всем строкам
воть:(
no subject
Date: 2010-07-06 07:00 am (UTC)Если да, функция и должна возвращать ноль - нужно ведь, чтобы деталь делалась в течение какой-то одной смены от начала до конца...
no subject
Date: 2010-07-06 08:52 am (UTC)смотри дорогая, мне очень нужна помощ, но я боюсь, что напрягаю тебя, чего мне очень не хочется делать.
no subject
Date: 2010-07-06 08:57 am (UTC)Не напрягаешь :)
Я это люблю.
no subject
Date: 2010-07-06 09:07 am (UTC)когда я пишу запрос
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?
а как тогда он знает за какой период времени меня интересуют тоцаот?
no subject
Date: 2010-07-06 09:21 am (UTC)Он умный. Он знает, сколько недель прошло с момента начала периода (там в теле функции есть дата начала периода, ее можно задать таблично, например)
Поэтому если группа 0, то он воспринимает ее как ту, что ПЕРВУЮ неделю работала в утро (сталбыть, и третью, и пятую...), а если один - то наоборот. :)
Вот от этого дня он считает:
Date: 2010-07-06 09:22 am (UTC)Эту переменную можно записать не хардкодед, а в таблицу или параметром передать (тогда дополнительным, четвертым)
Re: Вот от этого дня он считает:
Date: 2010-07-06 09:38 am (UTC)Re: Вот от этого дня он считает:
Date: 2010-07-06 09:41 am (UTC)В основном селекте отбери. Вне функции. Почему так нельзя?
Почему так нельзя?
Date: 2010-07-06 09:45 am (UTC)Re: Вот от этого дня он считает:
Date: 2010-07-06 09:43 am (UTC)error
Date: 2010-07-06 09:41 am (UTC)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)Вообще, конечно, для страховки надо @week_from tinyint, измени на smallint. Тогда хотя бы падать не будет при неправильных параметрах :)
Re: error
Date: 2010-07-06 09:50 am (UTC)2. Старт тайм должен быть меньше-равен ЕндТайм.
окей, получается но не совсем
Date: 2010-07-06 10:54 am (UTC)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
------------------------
уф.. :(
Re: окей, получается но не совсем
Date: 2010-07-06 11:04 am (UTC)Re: окей, получается но не совсем
Date: 2010-07-06 11:36 am (UTC)