سؤال

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

لدي تاريخ coulmn مع قيم مثل (yyyy / mm / dd)

2007/11/7
2007/1/8
2007/11/4
2007/12/3
2008/10/4
2009/11/5
2008/5/16

بعد الاستعلام، يجب أن يكون

2007/1/1
2007/11/1
2007/12/1
2008/5/1
2008/10/1
2009/11/1

هذا لا يبدو أنه يعمل

SELECT distinct (cast(year(datecol) as nvarchar(20) ) +
       '/'+ cast(month(datecol) as nvarchar(20) ) + '/1') as dt1 
FROM Table 
ORDER BY dt1
هل كانت مفيدة؟

المحلول

سيعمل ذلك مثل هذا على خادم MS SQL:

select 
    distinct 
    dateadd(day, -1 * DAY(datefield) + 1, datefield)
From
    datetable
order by
    dateadd(day, -1 * DAY(datefield) + 1, datefield) 

تدعو وظيفة DataDD التي تطرح أساسا (يوم-1) أيام من التاريخ الحالي -> يمكنك دائما الحصول على أول شيء في أي شهر في ذلك التاريخ.

الترتيب حسب ذلك وأنت انتهيت! :-)

بالإضافة إلى ذلك، يمكنك إضافة هذه الوظيفة إلى طاولتك ك "عمود محسوب" ثم استخدم ذلك لسهولة Acccess:

alter table yourTable 
  add FirstOfMonth As DATEADD(day, -1 * DAY(datefield) + 1, datefield) persisted

ثم سيكون الاستعلام الخاص بك أكثر بساطة:

SELECT DISTINCT FirstOfMonth
FROM YourTable
ORDER BY FirstOfMonth

مارك

نصائح أخرى

عند التعامل مع التواريخ في SQLServer تجنب استخدام cast مثل هذا - سوف يتغير التنسيق الناتج اعتمادا على تكوين الخادم.

بدلا من ذلك استخدام convert واختر تنسيق (على سبيل المثال 112) يضيف الأصفار الرائدة إلى الشهر.

أنيل، هل لديك أيضا جزء الوقت في التواريخ؟ ما نوع البيانات التي تستخدمها للعمود؟ هل تستخدم DateTime Datatype أو Char؟

هذا يعمل بالنسبة لي

SELECT DISTINCT (DateField) AS Date FROM DateTable ORDER BY 1
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top