سؤال

لقد واجهت وضعا غريبا جدا هنا. أنا الوصول إلى قاعدة البيانات (MDB) من خلال طائرة. يمكنني استخدام DBGrid و DBNavigator للسماح بالوصول إلى المستخدم. تم إنشاء DataSet باستخدام مكون Tadadoquery، مع الاستعلام التالي:

SELECT *, (DateDiff ('y',[Birth Date], Now())) AS [Age] FROM TableName

أنه يعمل بشكل جيد. ولكن كلما ضغطت على زر التحديث على DBNavigator، فإن نتيجة هذا الحقل المحسوب يصبح خطأ. على سبيل المثال، إذا كان لدي عادة 7 موضحة في العمود العمري، بعد الضغط على التحديث، يصبح 40149، 7 تغييرات على 40149، 6 تغييرات على 40150، 0 إلى 40156 وما إلى ذلك من أجل عرض النتيجة الصحيحة التي أحتاج إلى إعادة فتح الاستعلام مرة أخرى.

أي شخص يمكن أن يساعد؟

هل كانت مفيدة؟

المحلول

جرب ما يلي، مما سيعود العمر في أيام.

SELECT *, CINT(Now()-[Birth Date]) as AGE FROM TableName

بالنسبة للعمر في سنوات الاستخدام:

SELECT *, INT((Now()-[Birth Date]) / 365.242199) as AGEYRS from TableName

(ملاحظة، جولات Cint، Int لا)

السبب في أن هذا يعمل هو أن الوصول إلى تخزين تاريخ / وقته في طريقة مماثلة كدليل، كطفل حيث يمثل الجزء عدد صحيح عدد الأيام منذ يوم محدد والجزء الكسري كجزء كسور من ذلك اليوم (0.25 = 6 صباحا، 0.50 = الظهر، إلخ). وبالتالي، إذا كنت ترغب في معرفة الاختلافات بين يومين، فما عليك سوى خذ الاختلافات بين أرقام اليوم ... لعدد سنوات، فقس على ذلك عدد الأيام في السنة.

تعديل

خيار آخر هنا سيكون إنشاء حقل محسوب في دلفي وأداء المنطق هناك. في حدث الخاص بك oncalculated، ستعهد كود شيء مثل ما يلي:

procedure TForm1.ds1CalcFields(DataSet: TDataSet);
begin
  DataSet.FieldByName('CALCDATE').AsInteger := 
    Trunc((Date - DataSet.FieldByName('BIRTH DATE').AsDateTime) / 365.242199);
end;

تعديل

وحتى الآن طريقة ثالثة. بدلا من السماح للحديث بالعمل كما تفعل حاليا، قم بتجاوز السلوك وإجبار عن قرب / إعادة فتحات البيانات باستخدام OnClick of the Navigator:

procedure TForm1.dbnvgr1Click(Sender: TObject; Button: TNavigateBtn);
begin
  if Button = nbRefresh then
    begin
      ds1.Close;
      ds1.Open;
    end;
end;

نصائح أخرى

جرب هذه المعلمة الفاصلة بدلا من ذلك:

SELECT *, (DateDiff ('yyyy',[Birth Date], Now())) AS [Age] FROM TableName

إليك ما هو "الفواصل الزمنية" ل:

yyyy    Year
q   Quarter
m   Month
y   Day of Year
d   Day
w   Weekday
ww  Week
h   Hour
n   Minute
s   Second

لقد قمت باختبار مع تعليقك السابق، ولدي أيضا الخطأ نفسه.

أعتقد أنه خطأ في مكان ما في المستكشف أو في طائرة.

عندما تضغط على التحديث على NAV. يظهر 40149 هو تمثيل التاريخ باعتباره مزدوجا دون الاشياء المحسوبة. يبدو أنه يستخدم فقط العمود الأول الموجود وعرضه.

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

Select *, ' ' & DateDiff(.......) as [Age] From table1;

عندما أستخدم عمود من سلسلة أو رقم أولا في الحقل المحسوب، يتم عرض النتيجة كما ينبغي. يمكنك المحاولة :

SELECT *,  mid(id & (DateDiff ('y',[madate], Now())), len(id) + 1) AS [Age] FROM Table1

أو :

SELECT *,  (id-id) + (DateDiff ('y',[madate], Now()))  AS [Age] FROM Table1

هذا قبيح جدا، لكنه يفعل الخدعة ..

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top