اذهب الي المحتوي
أوفيسنا
بحث مخصص من جوجل فى أوفيسنا
Custom Search

كيفية استخراج الأعوام بين تاريخين


إذهب إلى أفضل إجابة Solved by Barna,

الردود الموصى بها

السلام عليكم،،

ومساؤكم سعيد،،

وأسأل الله في هذه اللحظات لكم البركة في الأهل والمال والولد والتوفيق لكل خير..

أساتذتنا الكرام،،

لدي جدول به أسماء أشخاص ولكل واحد منهم تاريخ بدء وتاريخ انتهاء..

مثلا 

محمد البداية من 1/8/2018 والانتهاء 5/8/2022

المطلوب كيف يمكن استخراج الأعوام بين التاريخين بمعنى أريد جدولا آخر أو استعلاما يظهر الآتي

محمد

2018

2019

2020

2021

2022

فهذه الأعوام التي بين التاريخين،،

وكذلك بقية الأسماء..

مع جزيل الشكر وعظيم الامتنان،،

 

الأعوام بين تاريخين.accdb

رابط هذا التعليق
شارك

اخي الكريم لعدم معرفة اسماء الحقول والجدول ، هذا تصور خيالي ، واستبدل انت اسم الجدول واسم الحقول بما يناسبك

 

SELECT [اسم حقل الإسم], Year([تاريخ البداية]) AS السنة
FROM [اسم الجدول]
WHERE Year([تاريخ البداية]) >= Year([تاريخ النهاية])

 

اذا لم تنجح ، فأرسل ملف 😊

تم تعديل بواسطه Foksh
رابط هذا التعليق
شارك

أستاذنا @Foksh شكر الله عطاءك وجهدك ورضي عنك..

حاولت ولكن لم تضبط معي.. حيث لم تظهر الأعوام بين تاريخين..

ودونك المثال للتكرم علينا زادكم الله من واسع فضله،،

الأعوام بين تاريخين.rar

رابط هذا التعليق
شارك

الأستاذ @Barna قام باقتراح جميل .

وهذه تجربة ثانية

SELECT [اسم الحقل],
       [اسم جدول].[اسم الحقل تاريخ البداية] AS البداية, 
       [اسم جدول].[اسم الحقل تاريخ النهاية] AS النهاية,
       Concat(Year([تاريخ البداية]), "/", Year([تاريخ النهاية])) AS [السنوات]
FROM [اسم جدول];

 

تم تعديل بواسطه Foksh
إضافة تجربة
  • Like 1
رابط هذا التعليق
شارك

لا أدري ماذا أقول بن طرفي الكريم والجمال..

الفكرة التي وضعها أستاذنا @Barna ممتازة لكني أريد أن تكون في عمود بحيث تكون على هذا النحو

image.png.b7ccf172f581345e9e14a2f3154f1263.png

بحيث يتسنى ربطها بمعلومات أخرى،،

والفكرة التي كانت من أستاذنا @Foksh تحتاج أن يكتمل العقد بها حيث يظهر أول التاريخ وآخره فقط دون التواريخ التي في المنتصف حيث كانت هذه النتيجة

image.png.1f35ffa5b0fac6b430c20432f4220692.png

 

فنحتاج كرما أن تعديل الكود بحيث يكون كل عام مستخرج بين عامين في صف متسقل مع الاسم..

مع جزيل الشكر..

رابط هذا التعليق
شارك

وأيضاً جرب هذا التعديل

SELECT [اسم الحقل],
       [اسم جدول].[اسم الحقل تاريخ البداية] AS البداية, 
       [اسم جدول].[اسم الحقل تاريخ النهاية] AS النهاية,
       Concat(Year([تاريخ البداية]), "/", Year([تاريخ البداية])+1, "/", Year([تاريخ البداية])+2) AS [السنوات]
FROM [اسم جدول];

 

رابط هذا التعليق
شارك

23 دقائق مضت, Barna said:

تفضل حسب طلبك .....

سلمت .. ممتاااز جدا لكن تبقى مشكلة التكرار حيث يكرر البيانات في كل مرة.. فإذا أضفت على الجدول بيانات جديدة يكرر السابق واللاحق،،

 

21 دقائق مضت, Foksh said:

وأيضاً جرب هذا التعديل

جربت لكن لم تضبط معي..

 

اعذروني أيها الكرام أثقلت عليكم،،

رابط هذا التعليق
شارك

  • أفضل إجابة
32 دقائق مضت, حامل المسك said:

لكن تبقى مشكلة التكرار حيث يكرر البيانات في كل مرة.

Sub InsertYears()
    Dim rsSource As DAO.Recordset
    Dim rsTarget As DAO.Recordset
    Dim StartDate As Date
    Dim EndDate As Date
    Dim iYear As Integer
    DoCmd.SetWarnings False
    DoCmd.RunSQL "DELETE TEMP_DATE.*  FROM TEMP_DATE;"
    DoCmd.SetWarnings True
    Set rsSource = CurrentDb.OpenRecordset("date1")
    Set rsTarget = CurrentDb.OpenRecordset("TEMP_DATE")
    Do Until rsSource.EOF
        StartDate = rsSource!t2
        EndDate = rsSource!t3

        For iYear = Year(StartDate) To Year(EndDate)
            rsTarget.AddNew
            rsTarget!t2 = CStr(iYear)
            rsTarget!t1 = rsSource!t1
            rsTarget.Update
        Next iYear

        rsSource.MoveNext
    Loop

    rsSource.Close
    rsTarget.Close

    Set rsSource = Nothing
    Set rsTarget = Nothing
End Sub

 

  • Like 1
رابط هذا التعليق
شارك

عذراً في التأخر بالرد بسبب فصل الانترنت

لدي فكرة اخرى مشاركة مع استاذي @Barna بحيث لا تتكرر البيانات ابداً .

في مديول ضع هذا الكود :-

Function GetYearsBetweenDates(startDate As Date, endDate As Date) As String
    Dim yearString As String
    Dim currentYear As Integer
    
   yearString = Year(startDate)
    currentYear = Year(startDate)
    
   Do While currentYear < Year(endDate)
        currentYear = currentYear + 1
        yearString = yearString & "/" & currentYear
    Loop
    
  GetYearsBetweenDates = yearString
End Function

ثم استخدم هذا الاستعلام Sql

SELECT [t1] AS [اسم الحقل],
       [date1].[t2] AS [البداية], 
       [date1].[t3] AS [النهاية],
       GetYearsBetweenDates([t2], [t3]) AS [السنوات]
FROM [date1];

😁

أن تصل متأخراً ، خير من أن لا تصل 

تم تعديل بواسطه Foksh
  • Thanks 1
رابط هذا التعليق
شارك

11 دقائق مضت, Foksh said:

أن تصل متأخراً ، خير من أن لا تصل

أنت لم تصل متأخرًا بل أنت صاحب السبق الأول والأفضال السابقة -بعد فضل الله- والكرم الجم..

تم تطبيق الكود وهذه النتيجة الجميلة.. واكتمال للفائدة لتكون معلما جميلا لكم إن أمكن أن تكون على هيئة صفوف.. بحيث يكون هناك أكثر من خيار..

image.png.19c5401e9c44ba1c261a8b29835a723c.png

لو أنني أنشدت ألف قصيدة في حقكم 

لوجدتها لا لا لا لا لا لا لا لن تفي

تم تعديل بواسطه حامل المسك
رابط هذا التعليق
شارك

امممممم 

بعض التعديلات كما يلي ، ونبدأ في المديول :-

Function GetYearsBetweenDatesForPerson(personName As String, startDate As Date, endDate As Date) As String
    Dim yearString As String
    Dim currentYear As Integer
    
   yearString = ""
    currentYear = Year(startDate)
    
  Do While currentYear <= Year(endDate)
        If yearString <> "" Then
            yearString = yearString & vbCrLf
        End If
        yearString = yearString & personName & ": " & currentYear
        currentYear = currentYear + 1
    Loop
    
     GetYearsBetweenDatesForPerson = yearString
End Function

 

ثم الاستعلام سيكون على هذا الشكل :-

SELECT GetYearsBetweenDatesForPerson([t1], [t2], [t3]) AS [السنوات]
FROM [date1];

 

جرب و وافني بالنتيجة 😊

طبعاً سيكون الإستخدام للمديول عاماً وليس خاصاً ، حيث تستطيع استخدامه لأكثر من جدول مع تغيير اسماء الحقول والجدول في الاستعلام في كل مرة 🤗

تم تعديل بواسطه Foksh
رابط هذا التعليق
شارك

30 دقائق مضت, Foksh said:

جرب و وافني بالنتيجة 😊

طبعاً سيكون الإستخدام للمديول عاماً وليس خاصاً ، حيث تستطيع استخدامه لأكثر من جدول مع تغيير اسماء الحقول والجدول في الاستعلام في كل مرة 🤗

لم تضبط

تحتاج شيئا من التعديل حيث لم يظهر عام البدء وعام الانتهاء ولم تكن في صفوف مستقلة

image.png.e335464b0ef73cc90a3a04b2d11a2cf6.png

رابط هذا التعليق
شارك

طيب ، جرب التعديل الاخير على المديول اخي @حامل المسك

Function GetYearsBetweenDatesForPerson(personName As String, startDate As Date, endDate As Date) As String
    Dim yearString As String
    Dim currentYear As Integer
    
   yearString = ""
    currentYear = Year(startDate)
    
  Do While currentYear <= Year(endDate)
        If yearString <> "" Then
            yearString = yearString & ", "
        End If
        yearString = yearString & currentYear
        currentYear = currentYear + 1
    Loop
    
    ' إرجاع السلسلة المكونة من سنوات
 GetYearsBetweenDatesForPerson = personName & ": " & yearString
End Function

 

والاستعلام

SELECT [t1] AS [اسم الشخص],
       [t2] AS [تاريخ البداية],
       [t3] AS [تاريخ النهاية],
GetYearsBetweenDatesForPerson([t1], [t2], [t3]) AS [السنوات]
FROM [date1];

 

وأخبرني بالنتيجة 😊

تم تعديل بواسطه Foksh
رابط هذا التعليق
شارك

اعتذر منك اخوي على تجاربي التي تكاد تلمس نجاح فكرتك ، اقوم بقراءة الكود نظرياً لعدم وجودي قرب الكمبيوتر في الوقت الحالي

سأقوم بتنفيذ الفكرة غداً سعياً لانجاح الفكرة ، فليس من طبعي الوقوف عند تجربة غير ناجحة والاستسلام لها.

 

🤗

تم تعديل بواسطه Foksh
تمت التجربة والكود غير فعال
  • Like 1
رابط هذا التعليق
شارك

5 ساعات مضت, Foksh said:

اعتذر منك اخوي على تجاربي التي تكاد تلمس نجاح فكرتك ، اقوم بقراءة الكود نظرياً لعدم وجودي قرب الكمبيوتر في الوقت الحالي

سأقوم بتنفيذ الفكرة غداً سعياً لانجاح الفكرة ، فليس من طبعي الوقوف عند تجربة غير ناجحة والاستسلام لها.

تعتذر وانت صاحب الفضل..

هذا من طيب المنبع وحسن التربية وجمال الأخلاق فرحم الله رحما حملك وأبا رباك..

والعلم رحم بين أهله..

والحمد لله الفائدة حاصلة بدءا بجهودك الرائعة وبمشاركة أستاذنا @Barna وإنما التكامل هنا للإثراء بجمال المعلومات واختيار أفضل الطرق..

لتكون لنا ولمن بحث وكتب ومر على هذا المنتدى الرائع.. وهذا الأثر الذي يبقى نفعه ويعم خيره..

شكرا لك @Foksh شكرًا لك @Barna قدمتم فأجدتم وأحسنتم نفعا وتكاملا..

 

  • Thanks 1
رابط هذا التعليق
شارك

هدفي والحمد لله تم تحقيقه :smile:

 

تم والحمد لله تعميم الفكرة بحيث يمكن استعمالها في أكثر من جدول ، وحسب الحاجة دون تقييد .

أولا انشاء المديول العام :-

Function CreateYearsRecords(sourceTableName As String, employeeFieldName As String, startDateFieldName As String, _
endDateFieldName As String, targetTableName As String, targetEmployeeFieldName As String, targetStartDateFieldName As String, targetEndDateFieldName As String, targetYearsFieldName As String)
    Dim sourceRS As DAO.Recordset
    Dim targetRS As DAO.Recordset
    Dim recordStartDate As Date
    Dim recordEndDate As Date
    Dim currentYear As Integer
    
    DoCmd.SetWarnings False
    DoCmd.RunSQL "DELETE " & targetTableName & ".* FROM " & targetTableName & ";"
    DoCmd.SetWarnings True
    
    Set sourceRS = CurrentDb.OpenRecordset(sourceTableName)
    Set targetRS = CurrentDb.OpenRecordset(targetTableName)
    
    Do Until sourceRS.EOF
        recordStartDate = sourceRS.Fields(startDateFieldName)
        recordEndDate = sourceRS.Fields(endDateFieldName)
        
        For currentYear = Year(recordStartDate) To Year(recordEndDate)
            targetRS.AddNew
            targetRS.Fields(targetEmployeeFieldName) = sourceRS.Fields(employeeFieldName)
            targetRS.Fields(targetStartDateFieldName) = sourceRS.Fields(startDateFieldName)
            targetRS.Fields(targetEndDateFieldName) = sourceRS.Fields(endDateFieldName)
            targetRS.Fields(targetYearsFieldName) = CStr(currentYear)
            targetRS.Update
        Next currentYear
        
        sourceRS.MoveNext
    Loop
    
    sourceRS.Close
    targetRS.Close
    
    Set sourceRS = Nothing
    Set targetRS = Nothing
End Function

 

ثانياً يمكن استدعاء الدالة كما يلي :-

Call CreateYearsRecords("date1", "t1", "t2", "t3", "TEMP_DATE", "EmployeeName", "StartDate", "EndDate", "Years")

بحيث يتم ادراج البيانات في جدول قابل للتغيير واسماء الحقول فيه أيضاً .

 

Get Date.accdb

تم تعديل بواسطه Foksh
  • Thanks 1
رابط هذا التعليق
شارك

السلام عليكم

توافقت الكتابة مع مشاركة اخي فادي الأخيرة

انا ارى ان حل اخونا البرناوي نموذجي .. ولمعالجة التكرار يتم حذف البيانات من الجدول قبل كل امر على النحو التالي

Private Sub أمر0_Click()
DoCmd.SetWarnings False
DoCmd.RunSQL "DELETE TEMP_DATE.*, * FROM TEMP_DATE"
DoCmd.SetWarnings True
Call InsertYears
End Sub

 

3الأعوام بين تاريخين.accdb

  • Thanks 1
رابط هذا التعليق
شارك

14 دقائق مضت, ابوخليل said:

توافقت الكتابة مع مشاركة اخي فادي الأخيرة

 

معلمنا الفاضل هذا من حسن حظي بلا شك :smile:

 

لا شك أن ألأستاذ @Barna أنتج عمل جميل وذكي ، إلا أن فكرتي كانت بتوسيع المجال ليس إلا :yes:

  • Like 1
  • Thanks 2
رابط هذا التعليق
شارك

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

زائر
اضف رد علي هذا الموضوع....

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • تصفح هذا الموضوع مؤخراً   0 اعضاء متواجدين الان

    • لايوجد اعضاء مسجلون يتصفحون هذه الصفحه
×
×
  • اضف...

Important Information