sql select
nrec
,dsopr
,cast('01'||'/'||case when MONTH(datetime(dsopr, 0))>=10 then '' else '0' end ||MONTH(datetime(dsopr, 0))||'/'||YEAR(datetime(dsopr, 0)) as string) as mesbeg
,cast(case
when MONTH(datetime(dsopr, 0)) in (1,3,5,7,8,10,12) then '31'
when MONTH(datetime(dsopr, 0)) in (4,6,9,11) then '30'
else '28' // а тута еще высокосные могут быть )
end
||'/'||case when MONTH(datetime(dsopr, 0))>=10 then '' else '0' end ||MONTH(datetime(dsopr, 0))||'/'||YEAR(datetime(dsopr, 0)) as string) as mesend
from katsopr where vidsopr=201 and dsopr>=#date(01,01,2014)
;
Недавно решал подобную проблему с использованием функций даты и времени для MS SQL.
Надо было получить первое число некоторого месяца.
идея сводится к использованию функции dateadd. Вот реализация, надеюсь пригодится.
Declare @ReportDate as date = GetDate();
Declare @SkladNelikvDate as integer = master.dbo.DateToGalDate( DATEADD(month, -3 , @ReportDate) );--Дата для неликвидов на складе
--Пелучаем дату первого числа для месяца по неликвидам
Declare @Nelik_Date as date = master.dbo.GalDateToDate(@SkladNelikvDate); -- для простоты следующего выражения
declare @DateForSaldMoun as integer = master.dbo.DateToGalDate( dateadd( DAY, -datePart(day, @Nelik_Date) + 1, @Nelik_Date));
Спасибо за ответы. Но. При реализации предложенной den'ом мы получаем дату не в формате атлантис, а строку (ну и конкретное утяжеление запроса как для чтения так и для его выполнения). Реализация предложенная zver'ем через dateadd классическая и правильная, но требует объявления своей процедуры и соответствующего ее подключения к галке, тк dateadd не доступна в прямом sql галки. Видимо, без своей процедуры не получится.