2017-02-08 4 views
0

У меня проблема с запросом, мой стол выглядит примерно как this.Запрос с ошибками

В результате запроса я хочу, чтобы начало месяца текущего дня знало, что если январь начинается 01/01/2017. Мы начинаем с последних дней месяца, мы знаем, что начало месяца - конец предыдущего месяца плюс один. Мой запрос выглядит следующим образом:

select * 
from (select top 11 case when replace(convert(varchar, EndMonth, 111), '/','-') = replace(convert(varchar, getdate(), 111), '/','-') then replace(convert(varchar, EndMonth, 111), '/','-') else replace(convert(varchar, DATEADD(day,1,EndMonth), 111), '/','-') end as inicio 
from EndMonths 
where EndMonth >= convert(date,getdate()) 
and Year between DATEPART (year, getdate()) 
and ((DATEPART (year, getdate())+1)) or id = (select top 1 id-1 from P_materials.dbo.dia_cierre_fiscal where Year= DATEPART (year, getdate()) and Month(EndMonth) = Month(getdate()) order by EndMonth desc) 
order by EndMonth)a 
union 
select case when GETDATE()<=(select EndMonth from EndMonths where Year=2017 and NameMonth='Jenuary') then convert(varchar,YEAR(GETDATE()))+'-01-01' else '' end 

он работает, прежде чем он был февраль, когда он был февраль он не дал мне тот же результат.

+1

Это NameMonth = 'Jenuary' – user1854438

+0

это не то, что вы ищете: http://stackoverflow.com/questions/3503742/how-to-get-date-representing-the-first-day- из месяца в месяц – kloarubeek

+0

извините, не так, что начало месяца - это EndMonth предыдущего месяца плюс день, например, если конец января - 03/02/2017, начало февраля будет 04/02/2017. Следует уточнить, что они являются финансовыми месяцами компании –

ответ

-1

Почему вы делаете это сложнее?

select cast(datepart(m, getdate()) as varchar(2)) + '/1/'+ cast (datepart(year, getdate()) as varchar (4)) 
+0

, потому что это финансовые месяцы, которые не начинаются с 1-го числа –

-1

Вы можете получить первый и последний день месяца, основываясь на предоставленную дату следующим образом:

DECLARE @MyDate DATE = '2017-02-01' 

SELECT DATEFROMPARTS(YEAR(@MyDate),MONTH(@MyDate),01) AS Start_Month 
     ,DATEADD(DAY, -1, DATEFROMPARTS(YEAR(@MyDate),MONTH(@MyDate) + 1,01)) AS End_Month 
+0

. Например, если конец января - 03/02/2017, начало февраля будет 04/02/2017. Следует уточнить, что они являются финансовыми месяцами компании –

0

Вот небольшая репродукция ваших данных, и запрос, который превращает его в дата начала/дата окончания пары:

WITH YourTable AS 
(
SELECT Label,D 
FROM (
VALUES 
('Jan',CAST('2017-02-03' AS DATE)), 
('Feb',CAST('2017-03-03' AS DATE)), 
('Mar',CAST('2017-03-31' AS DATE)), 
('Apr',CAST('2017-05-05' AS DATE)), 
('May',CAST('2017-06-02' AS DATE)) 
) T(Label, D) 
) 

SELECT ED.Label, 
(SELECT DATEADD(d,1,MAX(D)) FROM YourTable WHERE D < ED.D) StartDate, 
ED.D EndDate 
FROM 
YourTable ED 

Для того, чтобы использовать его просто подключить в дату вы хотите:

WITH YourTable AS 
(
SELECT Label,D 
FROM (
VALUES 
('Jan',CAST('2017-02-03' AS DATE)), 
('Feb',CAST('2017-03-03' AS DATE)), 
('Mar',CAST('2017-03-31' AS DATE)), 
('Apr',CAST('2017-05-05' AS DATE)), 
('May',CAST('2017-06-02' AS DATE)) 
) T(Label, D) 
) 

SELECT * 
FROM 
(
    SELECT ED.Label, 
    (SELECT DATEADD(d,1,MAX(D)) FROM YourTable WHERE D < ED.D) StartDate, 
    ED.D EndDate 
    FROM 
    YourTable ED 
) ATable 
WHERE GETDATE() BETWEEN StartDate AND EndDate 

Примечание для любых будущих вопросов: скриншоты в порядке, но некоторый фактический код SQL (т. код значений, который у меня выше), который позволяет нам быстро использовать ваши данные, упрощает и ускоряет работу для всех.

Смежные вопросы