获取月中的第一天(和最后一天) - 表达式简化

Sk1*_*1X1 3 sql firebird date

我需要在当前(和之前)月的第一天之前获得日期,即30天(之后我将使用90或18O).我写了这个,但我认为这是不必要的复杂,所以我来这里寻求帮助.这有什么办法可以简化这个:

ib_encodedate(EXTRACT(YEAR from (dateadd(-30-datediff(day from cast(EXTRACT(MONTH from CURRENT_DATE) 
|| '-1-' 
|| EXTRACT(YEAR from CURRENT_DATE) as date) to date 'now') DAY to CURRENT_DATE))), EXTRACT(MONTH from (dateadd(-30-datediff(day from cast(EXTRACT(MONTH from CURRENT_DATE) 
|| '-1-' 
|| EXTRACT(YEAR from CURRENT_DATE) as date) to date 'now') DAY to CURRENT_DATE))),EXTRACT(DAY from (dateadd(-30-datediff(day from cast(EXTRACT(MONTH from CURRENT_DATE) 
|| '-1-' 
|| EXTRACT(YEAR from CURRENT_DATE) as date) to date 'now') DAY to CURRENT_DATE))))
Run Code Online (Sandbox Code Playgroud)

在数据库中我有日期double,所以我必须使用函数ib_encodedate将日期转换为double与数据库中的日期进行比较.功能有原型:

ib_encodedate(INT year, INT month, INT day)
Run Code Online (Sandbox Code Playgroud)

我需要写一个月的最后一天.

谢谢你的帮助.

Cra*_*ted 7

好像你需要这样的东西:

SELECT
    DATEADD (-EXTRACT(DAY FROM CURRENT_DATE)+1 DAY TO CURRENT_DATE) AS FIRST_DAY_OF_MONTH,
    DATEADD (-30 DAY TO DATEADD (-EXTRACT(DAY FROM CURRENT_DATE)+1 DAY TO CURRENT_DATE)) AS A_MONTH_AGO,
    DATEADD (-90 DAY TO DATEADD (-EXTRACT(DAY FROM CURRENT_DATE)+1 DAY TO CURRENT_DATE)) AS THREE_MONTHS_AGO,
    DATEADD (-180 DAY TO DATEADD (-EXTRACT(DAY FROM CURRENT_DATE)+1 DAY TO CURRENT_DATE)) AS SIX_MONTHS_AGO
FROM 
    RDB$DATABASE
Run Code Online (Sandbox Code Playgroud)

使用firebird中的DATEADD函数,您可以轻松完成此操作.


小智 5

日期的第一天:

select cast(:DATA as date) - extract(day from cast(:DATA as date)) + 1 from RDB$DATABASE
Run Code Online (Sandbox Code Playgroud)

日期的最后一天:

select cast(:DATA as date) - extract(day from cast(:DATA as date)) + 32 - extract(day from (cast(:DATA as date) - extract(day from cast(:DATA as date)) + 32)) from RDB$DATABASE
Run Code Online (Sandbox Code Playgroud)