如何在sqlite中更改月份

Posted

技术标签:

【中文标题】如何在sqlite中更改月份【英文标题】:How to change month in sqlite 【发布时间】:2019-10-19 20:59:26 【问题描述】:

月份从 2019 年 9 月 16 日开始,到 2019 年 10 月 15 日结束 如果命运是 2019 年 11 月 10 日,我希望月份是 9 而不是 10 ..它在 vb 中有效 =(Month(Fields!Id.invdate.value)+IIF(Day(Fielfs!Id.invdate.value)

如何在 sqlite 中做 SELECT DISTINCT t1.AccNo,t1.InvDate,ifnull((SELECT MIN(t1min.InvDate) FROM t1 AS t1min WHERE t1min.InvDate > t1.InvDate AND t1.AccNo = t1min.AccNo), DATE(t1.InvDate,'start of month','+1 month', '0 day')) AS NextDate,

Strftime('%m',t1.InvDate) AS 周期 '这是如果日期 16/09 期间为 9 如果日期 11/10 期间显示 10 而不是 9

【问题讨论】:

Invdate nextdate period 16/09/2019 20/09/2019 9 20/09/2019 15/10/2019 9 15/10/2019 19/10/2019 9 19/10/2019 30 /10/2019 10 【参考方案1】:

使用 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常见的TExpressions(查询中可用的临时表)

第一天是一个月的开始日,有助于提高灵活性

即一个月的开始日期很容易过去,因此会有所不同。

第二个将日期重新格式化为 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 */

结果:-

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

【讨论】:

这是我在 sqlute 中的选择查询中的内容。 如果 sqlite 上的日期已经在 yyyy-MM-dd 中会发生什么。然后就不行了。 那么你不需要第二个 CTE,所以第三个使用 FROM mytable。但是,问题特别指出日期采用 dd/mm/yyyy 格式。 好的。将尝试并确认。谢谢 我试过了,还是不行。使用你的例子

以上是关于如何在sqlite中更改月份的主要内容,如果未能解决你的问题,请参考以下文章

如何在sqlite android中进行更改

如何在 c#.net 中使用 datetimepicker 获取月份更改后的月份数

如何仅在月份、日期和年份中更改我的日期选择器显示

如何在 extjs 日期字段或日期选择器中访问更改月份事件

如何在 Sqlite 数据库中的特定数据上更改 Listview 中的行颜色

如何在sqlite3中总结每月总数