每月从16/09/2019开始至15/10/2019如果命运是11/10/2019,我希望月份为9而不是10 ..=(Month(Fields!Id.invdate.value)+ IIF(Day(Fielfs!Id.invdate.value)<16,9,10)Mod 12 + 1
如何在sqlite中做SELECT DISTINCT t1.AccNo,t1.InvDate,ifnull((从t1 AS的SELECT MIN(t1min.InvDate)到t1min。的月份”,“ + 1个月”,“ 0天”))AS NextDate,
Strftime('%m',t1.InvDate)AS期间'这是如果日期16/09期间是9如果日期11/10期间显示10而不是9
使用SQLite,您可以使用类似:-
WITH
cte_month_start AS (SELECT 16) /* THE START DAY FOR THE MONTH */,
/* REFORMAT THE DATE TO YYYY-MM-DD format*/
cte_reformatted_date(rdate) AS (
SELECT(substr(mydate,7,4)||'-'||substr(mydate,4,2)||'-'||substr(mydate,1,2))
FROM mytable
),
/* SUBTRACT 1 FROM THE MONTH IF THE DAY OF THE MONTH IS LESS THAN THE START DAY */
cte_adjusted_date(adate) AS (
SELECT
CASE
WHEN CAST(strftime('%d',rdate) AS INTEGER) < (SELECT * FROM cte_month_start)
THEN date(rdate,'-1 months')
ELSE rdate
END
FROM cte_reformatted_date
)
SELECT substr(adate,9,2)||'/'||substr(adate,6,2)||'/'||substr(adate,1,4) AS mydate FROM cte_adjusted_date;
这使用3个[[C通用T可用的[[E表达式(查询中可用的临时表)]
即该月的开始日期可以轻松通过,因此可以更改。
第三者利用前CTE来输出未更改的日期(如果月份中的日期不小于该月的开始日期)或通过从日期中减去1个月而调整的日期(如果该日期是的月份小于开始日期。
您实际上不需要CTE,可以将它们嵌入,但是使用它们可以使代码更易于理解。
实施例/演示
/* PREPARE TEST ENVIROMENT BY CREATING AND POPULATING TABLES */
DROP TABLE IF EXISTS mytable;
CREATE TABLE If NOT EXISTS mytable(mydate TEXT);
INSERT INTO mytable VALUES
('16/09/2019'),('17/09/2019'),('18/09/2019'), /* DATES UNCHANGED */
('01/10/2019'),('02/10/2019'),('11/10/2019'), /* DATES THAT WILL BE ADJUSTED (month reduced)*/
('16/08/2019'),('11/09/2019') /* Other dates */
;
/* THE ACTUAL TEST */
WITH
cte_month_start AS (SELECT 16) /* THE START DAY FOR THE MONTH */,
/* REFORMAT THE DATE TO YYYY-MM-DD format*/
cte_reformatted_date(rdate) AS (
SELECT(substr(mydate,7,4)||'-'||substr(mydate,4,2)||'-'||substr(mydate,1,2))
FROM mytable
),
/* SUBTRACT 1 FROM THE MONTH IF THE DAY OF THE MONTH IS LESS THAN THE START DAY */
cte_adjusted_date(adate) AS (
SELECT
CASE
WHEN CAST(strftime('%d',rdate) AS INTEGER) < (SELECT * FROM cte_month_start)
THEN date(rdate,'-1 months')
ELSE rdate
END
FROM cte_reformatted_date
)
/* RESULTS OF THE TEST */
SELECT substr(adate,9,2)||'/'||substr(adate,6,2)||'/'||substr(adate,1,4) AS mydate FROM cte_adjusted_date;
DROP TABLE IF EXISTS mytable; /* CLEAN UP TEST ENVIRONMENT */
可以看到突出显示的行已相应调整。