Вопрос

Мне нужен отдельный столбец года и месяца из даты, который будет отсортирован по одному и тому же столбцу.

У меня есть дата со значениями типа (ГГГГ/ММ/ДД)

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 Server:

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

Вызов функции DATEADD по сути вычитает (day-1) DAYS из текущей даты --> вы всегда получаете первое число любого месяца, в котором находится эта дата.

Отсортируйте по нему, и все готово!:-)

Кроме того, вы также можете добавить эту функцию в свою таблицу как «вычисляемый столбец», а затем использовать ее для облегчения доступа:

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