الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

مطلوب إستعلام لتحديد الورديات بين تاريخن

بدأه MohamedAliSalim في 9 ديسمبر 2013 · 5 رد · 483 مشاهدة · في قواعد بيانات Microsoft SQL Server
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

أمامي كويري مش عارف اوصلها

عندي جدول به الورديات وهو كالتالي

/****** Object:  Table [dbo].[PR_Shifts]    Script Date: 12/9/2013 3:41:49 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[PR_Shifts]') AND type in (N'U'))
BEGIN
CREATE TABLE [dbo].[PR_Shifts](
	[ID] [int] IDENTITY(1,1) NOT NULL,
	[Code] [int] NOT NULL,
	[NameAr] [nvarchar](50) NOT NULL,
	[NameEn] [nvarchar](50) NULL,
	[ShiftFrom] [time](7) NOT NULL,
	[ShiftHours] [int] NULL,
	[ShiftTo]  AS (dateadd(hour,[shifthours],[ShiftFrom])),
 CONSTRAINT [PK_PR_Shifts] PRIMARY KEY CLUSTERED 
(
	[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
END
GO
SET IDENTITY_INSERT [dbo].[PR_Shifts] ON 

GO
INSERT [dbo].[PR_Shifts] ([ID], [Code], [NameAr], [NameEn], [ShiftFrom], [ShiftHours]) VALUES (3, 1, N'وردية اولي ', NULL, CAST(0x070040230E430000 AS Time), 8)
GO
INSERT [dbo].[PR_Shifts] ([ID], [Code], [NameAr], [NameEn], [ShiftFrom], [ShiftHours]) VALUES (4, 2, N'وردية ثانية ', NULL, CAST(0x070080461C860000 AS Time), 4)
GO
INSERT [dbo].[PR_Shifts] ([ID], [Code], [NameAr], [NameEn], [ShiftFrom], [ShiftHours]) VALUES (6, 3, N'وردية ثالثة', NULL, CAST(0x07002058A3A70000 AS Time), 12)
GO
SET IDENTITY_INSERT [dbo].[PR_Shifts] OFF
GO
IF NOT EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[DF_PR_Shifts_ShiftHours]') AND type = 'D')
BEGIN
ALTER TABLE [dbo].[PR_Shifts] ADD  CONSTRAINT [DF_PR_Shifts_ShiftHours]  DEFAULT ((8)) FOR [ShiftHours]
END

GO

وبه البيانات الموضحة أمامكم

 

ومعي تاريخين تاريخ بداية وتاريخ نهاية

تاريخ البداية هو : 2013-12-09 08:30

تاريخ النهاية هو : 2013-12-11 11:00

 

المطلوب جملة إستعلامية توضح الورديات المطلوبة لتغطي الفترة بين تاريخ البداية وتاريخ النهاية الموضحين

 

يعني ناتج الكويري هايكون كما موضح بالصورة

 

post-73411-0-08258900-1386597983_thumb.p

Mohamed Ali Salim

0.1..0...4....7.....6......2.......7........4.........8

#2

السلام عليكم ..

في الصورة , السطر الخاص بــ Shift2  الا يحوي خطأ , طالما أنه سيعمل 4 ساعات , من الساعة 16 إلى الساعة 20 , فلماذا تغيير اليوم من 9 إلى 10 , اليس المفروض أن تبقى بنفس اليوم (9) .

لا إله إلا الله ... محمد رسول الله

لو كانت مشاركتي مفيدة و تريد تشجيعي على المزيد من العطاء , فضلا قم بتقييم المشاركة

المعرًف القديم : houssam11350_11350

من مواضيعي : ArabGenCode : مولد كود و إجراءات مخزنة و واجهات لجداول سيكوال سيرفر

#3
حسام الشامي كتب:

السلام عليكم ..

في الصورة , السطر الخاص بــ Shift2  الا يحوي خطأ , طالما أنه سيعمل 4 ساعات , من الساعة 16 إلى الساعة 20 , فلماذا تغيير اليوم من 9 إلى 10 , اليس المفروض أن تبقى بنفس اليوم (9) .

تمام الله ينور .. خطأ غير مقصود

شكراً على الملاحظة

هل من كويري لعمل ما اريد؟

Mohamed Ali Salim

0.1..0...4....7.....6......2.......7........4.........8

#4

السلام عليكم ..

محاولتي تتطلب الأكواد التالية : 

CREATE FUNCTION [dbo].[IsTimeBetween](@TheValue time , @StartTime time , @EndTime time )

RETURNS bit
AS
BEGIN
declare @result bit

	IF @StartTime < @EndTime 
	BEGIN
			IF (@StartTime <= @TheValue) AND (@TheValue <= @EndTime) 	
				SET @result = 1;
			ELSE		
				SET @result = 0;
			
	END		
	ELSE 
		-- @StartTime >  @EndTime 
	BEGIN	 
		 IF (@StartTime <= @TheValue AND @TheValue <= '23:59:59')  OR  ('00:00:00' <= @TheValue AND @TheValue <= @EndTime)
				SET @result = 1;
			ELSE
				SET @result = 0;
									
	END

return @result
END

 و الدالة: 

-- =============================================
-- Combine 01/12/2013 11:30:00 with 05:20:23 = 01/12/2013 05:20:23 
--	i.e replace (11:30:00  with  05:20:23 )
-- =============================================
CREATE FUNCTION [dbo].[Combine_DateTimeWithTime]
(
	@dt datetime ,
	@t time
)
RETURNS datetime
AS
BEGIN
declare @d date
declare @newDt datetime
set @d = cast(@dt as date)
set @newDt = cast(@d as datetime)
return dateadd(second, 
                  datepart(hour,@t) * 3600 + 
                  datepart(minute,@t) * 60 + 
                  datepart(second,@t),
                  @newDt)
	

END

و الكود النهائي : 

--SELECT * FROM PR_Shifts

declare @dtStart datetime
declare @dtEnd datetime
set @dtStart = '2013-12-09 08:30'
set @dtEnd = '2013-12-11 11:00'

declare @tStart time
declare @tEnd time
set @tStart = cast(@dtStart as time)
set @tEnd = cast(@dtEnd  as time)

IF OBJECT_ID('tempdb..#temp') IS NOT NULL
   DROP TABLE #temp
create table #temp (
	[seq] [int] ,
	[ID] [int] ,
	[Code] [int],
	[NameAr] [nvarchar](50),
	[ShiftFrom] datetime ,
	[ShiftHours] [int],
	[ShiftTo] datetime ); 
declare @IsDone tinyint
set @IsDone = 0
declare @ID int
	declare @Code int
	declare @NameAr nvarchar(50)
	declare @ShiftFrom time 
	declare @ShiftHours int
	declare @ShiftTo time
declare @IsFirstRow bit
set @IsFirstRow = 0

declare @seq int
set @seq = 0
while @IsDone = 0
BEGIN
select @ID = ID ,@Code = Code ,
		 @NameAr = NameAr ,@ShiftFrom = ShiftFrom ,
		  @ShiftHours = ShiftHours ,
		   @ShiftTo = ShiftTo 
from PR_Shifts    where dbo.IsTimeBetween(@tStart , ShiftFrom , ShiftTo ) = 1
set @seq = @seq + 1
IF @IsFirstRow = 0
	INSERT INTO #temp VALUES (@seq , @ID , @Code , @NameAr ,@dtStart ,	@ShiftHours , dbo.Combine_DateTimeWithTime(dateadd(hour ,@ShiftHours, @dtStart), @ShiftTo))
ELSE
	INSERT INTO #temp VALUES (@seq , @ID , @Code , @NameAr , dbo.Combine_DateTimeWithTime(@dtStart, @ShiftFrom)   ,
		@ShiftHours , dbo.Combine_DateTimeWithTime(dateadd(hour ,@ShiftHours, @dtStart), @ShiftTo));

set @IsFirstRow = 1
set @dtStart = DATEADD(hour ,@ShiftHours , @dtStart)
set @tStart = cast(@dtStart as time)
if @dtStart >= @dtEnd 
	set @IsDone = 1

END
if @seq <> 0 
	update #temp set ShiftTo = @dtEnd , ShiftHours = DATEDIFF(hour ,ShiftFrom , @dtEnd  )  Where #temp.seq = @seq;

select * from #temp;
drop table #temp;

تم تعديل هذه المشاركة بواسطة حسام الشامي في 10 ديسمبر 2013 في 01:45

لا إله إلا الله ... محمد رسول الله

لو كانت مشاركتي مفيدة و تريد تشجيعي على المزيد من العطاء , فضلا قم بتقييم المشاركة

المعرًف القديم : houssam11350_11350

من مواضيعي : ArabGenCode : مولد كود و إجراءات مخزنة و واجهات لجداول سيكوال سيرفر

#5

متشكر جدا جدا على متابعتك للموضوع بجدية

وفكرتك ممتازة

ربنا يخليك للمزنوقين   :]

Mohamed Ali Salim

0.1..0...4....7.....6......2.......7........4.........8

#6

لا شكر على واجب ... بالتوفيق .

لا إله إلا الله ... محمد رسول الله

لو كانت مشاركتي مفيدة و تريد تشجيعي على المزيد من العطاء , فضلا قم بتقييم المشاركة

المعرًف القديم : houssam11350_11350

من مواضيعي : ArabGenCode : مولد كود و إجراءات مخزنة و واجهات لجداول سيكوال سيرفر

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…