2017-02-08 3 views
0

쿼리에 문제가 있습니다. 내 테이블은 this입니다.오류가있는 쿼리

오늘 결과가 1 월 인 경우 2011 년 1 월 1 일에 시작된다는 것을 알기 때문에 오늘 날짜의 시작을 원합니다. 우리는 그 달의 마지막 날부터 시작하여, 그 달의 시작은 이전 달의 끝인 1 월을 더한 것입니다. 다음과 같이 내 질문은 : 그것은 나에게 같은 결과를주지 않았다 2월이었다 일단은 2 월이었다 전에 실행중인

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

Is NameMonth = 'Jenuary' – user1854438

+0

이게 원하는 것이 아닙니다. http://stackoverflow.com/questions/3503742/how-to-get-date-representing-the-first-day- of-a-month – kloarubeek

+0

예를 들어, 1 월 말이 03/02/2017이고 2 월 초가 04/월이 될 경우 예를 들어 월의 시작 부분에 이전 달의 EndMonth가 더해진 것입니다. 02/2017. 회사의 회계 개월 인 것으로 분명히해야합니다. –

답변

-1

왜 이렇게 복잡하게 만들었습니까?

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

은 첫 번째 –

-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

에서 시작하지 않는 회계 월이기 때문에 예를 들어 1 월말이 03/02/2017 일 경우 2 월 초가 2017 년 4 월 2 일이됩니다. 그들은 회사의 회계 개월임이 분명해야합니다. –

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 * 
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 
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 

당신이 원하는 당신은 그냥 날짜를 연결 그것의 사용을 만들려면

앞으로의 질문에 유의하십시오. 스크린 샷은 괜찮지 만 일부 실제 SQL 코드 (예 : 위에서 제시 한 값 코드)를 사용하면 신속하게 모든 데이터를 사용하여 모든 사람이 쉽고 빠르게 작업 할 수 있습니다.

관련 문제