如何在sqlite中更改月份

问题描述 投票:0回答:1

每月从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 rdlc fiscal
1个回答
0
投票

使用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表达式(查询中可用的临时表)]

    第一个是该月的开始日期,有助于提高灵活性的可能性
  • 即该月的开始日期可以轻松通过,因此可以更改。

  • 第二个日期将日期重新格式化为SQLite Date And Time Functions]易于操作的日期>
  • 第三者利用前CTE来输出未更改的日期(如果月份中的日期不小于该月的开始日期)或通过从日期中减去1个月而调整的日期(如果该日期是的月份小于开始日期。

  • 您实际上不需要CTE,可以将它们嵌入,但是使用它们可以使代码更易于理解。

  • 使用SQLite时,如果日期以可识别的格式存储(按照链接),则日期的操作会更简单。

实施例/演示

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

结果:-
enter image description here

可以看到突出显示的行已相应调整。

© www.soinside.com 2019 - 2024. All rights reserved.