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

سؤال في تحويل صيغ التاريخ

بدأه محمد غريب في 27 يناير 2010 · 11 رد · 4,945 مشاهدة · في قواعد بيانات Microsoft SQL Server
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله وبركاته ,,,,,,,

عندي متغير نصي يحمل القيمة '16/01/2010' , واريد ان استخرج الشهر من هذا التاريخ فأستخدم الاستعلام التالي :

Select Month(MyVar)

ولكنه يعطي خطأ في تحويل المتغير النصي الى النوع Datetime

وايضاً يعطي نفس الخطأ عند استعمال الدالة Convert لتحويل المتغير الى النوع Datetime

وما فهمته ان الخطأ ينتج لان البرنامج يعتبر ان صيغة التاريخ MM/DD/YYYY لذا يكون الشهر 16 وهذا خطأ

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

Select Convert (VarChar,MyVar,103)

او الاستعلام الاتي :

Select Convert (datetime,MyVar)

فكيف اجعل البرنامج يتعامل مع التاريخ بالصيغة DD/MM/YYYY

اوك كيف احول الصيغة من DD/MM/YYYY الى MM/DD/YYYY

وشكراً ,,,,,,,,,,,,

It does not matter what they know about you, but what you can do, so let your work speak of you

mmghv VB6 Programmer

#2

السلام عليكم ,, سؤالك لم يتضح لي بصورة كبيرة

ولكن جرب هذا الكود

 Dim s As Date
        s = #10/9/1111#
        MsgBox(s.Month)

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

او بطريقة اخرى

---

       Dim s As String
        s = Format(Now, "yyyy/MM/dd")
        '===========

        Dim year As String = Mid(s, 1, 4)

        Dim month As String = Mid(s, 6, 2)
        month = Replace(month, "\", "")
        month = Replace(month, "/", "")
        '===========

        Dim day As String = Mid(s, 9, 2)
        day = Replace(day, "\", "")
        day = Replace(day, "/", "")
        '============

        MsgBox(year & vbCrLf & "السنة")

        MsgBox(month & vbCrLf & "الشهر")

        MsgBox(day & vbCrLf & "اليوم")

تم تعديل هذه المشاركة بواسطة dot.net2008 في 27 يناير 2010 في 07:37

#3

اخي dot.net200 شكراً على الرد لكن كل تعاملي حتى الان مع الـ Sql Server لو كان الامر في الفيجوال بيسك لكان سهل

بفضل الله وجدت الحل وهو وضع لتصريح التالي قبل الاستعلام :

Set DateFormat dmy

ولكن لي سؤال صغير , جربت ان استخدم هذا التصريح داخل Function لكن عطاني خطأ تقريباً يفيد بأنه لا يمكن استخدام مثل هذا التصريح داخل الـ Function , فهل يوجد طريقة لإستخدام هذا التصريح داخل الـ Function ??

وشكراً ,,,,,,,,

It does not matter what they know about you, but what you can do, so let your work speak of you

mmghv VB6 Programmer

#4

اعتذر اخي خِلتُ نفسي في قسم الدوت نيت :excl:

وفقك الله

تم تعديل هذه المشاركة بواسطة dot.net2008 في 27 يناير 2010 في 09:16

#5

ولا يهمك اخي الكريم وكان الله في العون :)

It does not matter what they know about you, but what you can do, so let your work speak of you

mmghv VB6 Programmer

#6

السلام عليكم

1-بشكل عام حتى بتم التعامل مع صيغة التاريخ العربي بشكل مباشر يجب تغيير الاعدادت من خلال الويندوز من خلال اعدادت اقليمية ووضع الصيغة هناك بالشكل DD/MM/yyyy .

2-اذا وجد عندك حقل نصي يحتوي على تاريخ بالصيغة DD/MM/yyyy لتحويله الى تاريخ نستخدم مايلي (في دالة التحويل نستخدم 103):

declare @MyVar varchar(10) ,@dt datetime
حselect @MyVar ='27/01/2010'
select @dt= Convert (datetime,@MyVar,103)

select day(@dt)

3-واذا وجد التاريخ بالصيغة MM/dd/yyyy نستخدم مايلي (في دالة التحويل نستخدم 102) :

declare @MyVar varchar(10) ,@dt datetime
select @MyVar ='01/27/2010'
select @dt= Convert (datetime,@MyVar,102)
select day(@dt)

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

لذا من الافضل تمرير الباراميتر كتاريخ وليس كنص وايضا عدم استخدام حقول نص للتاريخ .

#7

شكراً جزيلاً اخي طارق على الرد والتوضيح ,,,

اما بخصوص :

TareqVB كتب:

1-بشكل عام حتى بتم التعامل مع صيغة التاريخ العربي بشكل مباشر يجب تغيير الاعدادت من خلال الويندوز من خلال اعدادت اقليمية ووضع الصيغة هناك بالشكل DD/MM/yyyy .

لا استطيع الاعتماد على هذا حيث لا اضمن هذا في جهاز العميل حتى ولو طلبت منه هذا , في ذالك الحين لو اظهر البرنامج خطأ سيقول ان برنامجي فاشل

اما بخصوص :

TareqVB كتب:

لذا من الافضل تمرير الباراميتر كتاريخ وليس كنص وايضا عدم استخدام حقول نص للتاريخ .

فأان لا يمكنني هذا ايضاً حيث يخزن في الحقل الواحد مجموعة من التواريخ الغير معروف عددها كمصفوف للسجل الواحد لذا لا يمكنني استعمال حقل من نوع تاريخ ( وان جيت للحق انا عامةً لا احب تحديد انواع الحقول في الداتا بيز واتركها نصي واتعامل من خلال الفيجوال بما اريد من قواعد لهاذا الحقل , فأنا ابداً لا احب إظهار خطأ من قبل الداتا بيز داخل برنامجي وافضل ان اضع قوانين الحقل بنفسي لابعد مصدر الخطأ نهائياً عن الداتا بيز )

اما بخصوص ما كنت اريده في البداية وهو :

TareqVB كتب:

2-اذا وجد عندك حقل نصي يحتوي على تاريخ بالصيغة DD/MM/yyyy لتحويله الى تاريخ نستخدم مايلي (في دالة التحويل نستخدم 103):

select Convert (datetime,@MyVar,103)

فهذا ما كنت احتاجه وعمل معي بشكل جيد ولكني والله جربته قبل ذلك ولم يعمل معي لا اعرف لماذا , ربما لأن يدك مباركة :D , على العموم انا متشكر جداً يا اخي لكن مشكلة صيغة التاريخ هذه هي عند استخدم دالة IsDate فأنه يعطي خطأ , ولا يمكنني استخدام دالة التحويل هنا حيث إذا كان هناك خطأ في التاريخ فسيعطي البرنامج خطأ ناتج عن دالة التحويل

لذا الحل الامثل لهذه المشكلة بالنسبة لي هو التصريح Set DatFormat mdy , لكن يا اخي انا لا استطيع استخدامه داخل الـ Function

فتكون مشكور جداً إذا كان عندك طريقة لإستخدام مثل هذا الاستعلام في الـ Function

وشكراً جزيلاً مرة اخرى اخي الكريم :)

It does not matter what they know about you, but what you can do, so let your work speak of you

mmghv VB6 Programmer

#8

بالنسبة Set DateFormat dmy

ليس من الضروري استدعاؤها في ال function وانما يكفي ان تطلب مرة واحدة قبل استدعاء ال function

CREATE FUNCTION xxxfn()
RETURNS int
AS
BEGIN
 declare @MyVar varchar(10) ,@dt datetime
 select @MyVar ='22/01/2010'


RETURN isdate(@MyVar)

END

GO
Set DateFormat dmy
select dbo.xxxfn()
#9

شكراً اخي الكريم , لكن لي سؤال اخير خاص بالفيجوال بيسك , صممت الاستعلام وشروطه وكل شئ تمام , ولكن اكتشفت ان الـ Adodc لا يقبل المصطلح "Go" في الاستعلام حيث افصل به بين Set DateFormat dmy واستعلام With فهل هناك حل لهاذا الموضوع ؟

It does not matter what they know about you, but what you can do, so let your work speak of you

mmghv VB6 Programmer

#10

شكراً لكم اخواني وشكراً لك اخي TareqVB , بالنسبة للفيجوال بيسك فقد وجدت الحل بفضل الله وهو حذف "Go" ووضع فاصلة منقوطة في نهاية الجملة Set DateFormat dmy ( بالرغم من انني لا اعرف فائدتها )

It does not matter what they know about you, but what you can do, so let your work speak of you

mmghv VB6 Programmer

#11

السلام عليكم

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

insert into x values(1) ;
insert into x values(2);
insert into x values(3)

اقتباس

( وان جيت للحق انا عامةً لا احب تحديد انواع الحقول في الداتا بيز واتركها نصي واتعامل من خلال الفيجوال بما اريد من قواعد لهاذا الحقل , فأنا ابداً لا احب إظهار خطأ من قبل الداتا بيز داخل برنامجي وافضل ان اضع قوانين الحقل بنفسي لابعد مصدر الخطأ نهائياً عن الداتا بيز )

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

#12

شكراً اخي الكريم لتوضيح فائدة الفاصلة المنقوطة

اما بالنسبة للإستعلامات الخارجية للداتابيز فهاذا ممنوع بتاتاً للمستخدم , فمن خلال البرنامج يقوم بما يريده كله في تنظيم وبقواعد لا يمكن من خلالها إيجاد ثغرة في البرنامج حتى يبقى النظام مترابط ومتكامل بالكامل وهذه القواعد تمنع المستخدم من خلخلة هذا التكامل بين جميع اجزاء النظام , فأنا شعاري في العمل : احتمال وجود خطأ 0%

فإن سمحت للمستخدم بالدخول للداتابيز سيعمل دون القواعد الموضوعة للبرنامج وبالتالي يؤدي اي إحداث اخطاء وثغرات في البرنامج مما يؤدي الى هدم هذا التكامل بين اجزاء النظام وبالتالي الى سقوطه , بالإضافة الى صعوبة التعامل مع الداتابيز مباشرةً لوجود علاقات وارتباطات وإعدادات لا يمكن للمستخدم العادي القيام بها داخل الداتا بيز

It does not matter what they know about you, but what you can do, so let your work speak of you

mmghv VB6 Programmer

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