سؤال
أحتاج سنة مميزة وشهر من عمود التاريخ الذي سيتم فرزه بواسطة نفس العمود.
لدي تاريخ 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