显示当前日期和两个特定日期之间天数的 SQL 查询

Posted

技术标签:

【中文标题】显示当前日期和两个特定日期之间天数的 SQL 查询【英文标题】:SQL query that displays the current date and count of days between two specific dates 【发布时间】:2020-02-14 20:06:42 【问题描述】:

我正在尝试编写一个 SQL 查询,根据它所在的财务期显示天数和日期的计数。财务期从月底前 5 天开始,例如 3 月 27 日至 4 月 26 日

对于上述期间,如果日期是 3 月 29 日,则当天计数应为 3,日期应为 2020-04。日期应根据其所处的时期进行调整。

我试图通过编写以下脚本来解决此查询的第二部分,但它没有带来任何结果

declare @date datetime
set @date = getdate()
SELECT format (date,'yyyy-MM-dd') as date

where @date

between dateadd(day,-5,EOMONTH(getdate(),-1)) and dateadd(day,-5,EOMONTH(getdate()))

【问题讨论】:

您的财务周期有不同的天数。如果日期是 1 月 25 日,则 2 月财务期间没有对应的日期。因此,您的问题需要更多关于业务规则的解释。 欢迎来到 Stack Overflow。获取Tour 并阅读How To Ask。阅读此well structured question,然后阅读edit 您的问题以及其他详细信息,以帮助我们为您提供帮助。 @GordonLinoff 感谢您的回复,我已经编辑了实际帖子,添加了一个简短的脚本来解决这个问题的一部分,所以您可以检查一下。 declare @d date = '20200329'; select iif(@d < dateadd(day, -5, EOMONTH (@d, 0)), dateadd(day, -5, EOMONTH (@d, -1)) , dateadd(day, -5, EOMONTH (@d, 0))) as startoffinancialmonth, datediff(day, iif(@d < dateadd(day, -5, EOMONTH (@d, 0)), dateadd(day, -5, EOMONTH (@d, -1)) , dateadd(day, -5, EOMONTH (@d, 0))), @d) daysdiff; 【参考方案1】:

更新为包括上个月的 5 天。

这是你要找的第二部分吗?

编辑:修改查询。我想这应该为您提供这两个部分所需的东西。 您可以尝试更改 set @date 中的日期。

请注意,-4 而不是 -5 是故意的,正如您所说的财政月提前 5 天开始。对于 3 月,31 - 5 会给出 26,但它应该从 27 开始,对吗?所以29号没有。天数应该是 3,包括 27 和 29。无论如何,查询应该是不言自明的,可能只需要根据您的要求更改数字。

declare @date datetime
--set @date = getdate()
set @date = '2020-02-14'

SELECT format(@date,'yyyy-MM-dd') as date,
case WHEN @date < dateadd(day,-4,EOMONTH(@date)) THEN format(EOMONTH(@date),'yyyy-MM')
     ELSE format(EOMONTH(@date, 1),'yyyy-MM') END
     AS FinancialMonth,
     CASE WHEN @date < dateadd(day,-4,EOMONTH(@date)) THEN DATEDIFF(day,dateadd(day,-5,EOMONTH(@date,-1)), @date)
     ELSE DATEDIFF(day, dateadd(day,-5,EOMONTH(@date)), @date) END
     AS CountDays

【讨论】:

您好,Viraj,感谢您的调查。您的答案非常接近,但计数天数不包括上个月的天数,例如当我写 set @date = '2020-3-20' 时它给出了 20 天,但实际上它应该通过包含 5 天给出 25二月 嗨,托尼。这是正确的。我错过了那部分。我编辑了查询以包含上个月的 5 天。希望对您有所帮助。 这行得通吗?如果确实如此,那么您可以将其标记为已回答。我也很想知道这是否是您想要的。 谢谢 Viraj,它确实有效。我已将其标记为已回答【参考方案2】:

以下代码将计算您需要的内容。请阅读代码中的 cmets。

-- First, lets declare all the variables we need.
-- I tried to name them so they are selfexplanatory.
declare @inputdate DateTime, 
            @financialPeriodStartDate DateTime,
            @EndOfTheMonth DateTime,
            @nextFinantialMonthYear DateTime,
            @previousFinancialPeriodStartDate DateTime
-- Now we calculate some of the values
    set @inputdate = GETDATE() -- Let's use Today's date, but you can change this to any date.
    set @EndOfTheMonth = EOMONTH(@inputdate) -- This is the end of the month for the input date
    set @financialPeriodStartDate = DATEADD(DAY,-5,EOMONTH(@inputdate)) -- This is you Financial Period Start Date for the giving input date.
    set @previousFinancialPeriodStartDate = DATEADD(DAY,-5,EOMONTH(DATEADD(MONTH, -1, @inputdate))) -- Also calculates the Start Date of the precious financial period.
    set @nextFinantialMonthYear = DATEADD(MONTH, 1,@financialPeriodStartDate) -- This is the start date of the next financial period.

-- In the following Select, it calculates the values you need, based in the previous variables.
    select 
    @inputdate as Today,
    @EndOfTheMonth as EndOfMonth,
    @previousFinancialPeriodStartDate as PreviousFinancialPeriodStartDate,
    @financialPeriodStartDate as FinacialPeriodStartDate,
    CASE WHEN DATEDIFF(DAY , @financialPeriodStartDate, @inputdate + 1  ) < 0
         THEN DATEDIFF(DAY , @previousFinancialPeriodStartDate, @inputdate + 1  ) 
         WHEN DATEDIFF(DAY , @financialPeriodStartDate, @inputdate + 1  ) >=0
         THEN DATEDIFF(DAY , @financialPeriodStartDate, @inputdate + 1  )
    END as DaysFromFPStartDate,
    STR(YEAR(@nextFinantialMonthYear)) +'-'+LTRIM(RTRIM(STR(MONTH(@nextFinantialMonthYear)))) as NextFinantialPeriodMonthAndYear

希望对你有帮助。

【讨论】:

纯代码答案通常没有多大帮助。这可能行得通,但如果你不向发帖者以及将来可能出现的任何人解释它,它只是一个代码块。

以上是关于显示当前日期和两个特定日期之间天数的 SQL 查询的主要内容,如果未能解决你的问题,请参考以下文章

利用SQL语句如何获得两个日期之间相差的天数

查询两个日期相差的月数和剩下的天数

(Java / Android) 计算两个日期之间的天数并以特定格式呈现结果

如何在 oracle sql 中提取两个日期之间的天数?

SQL SERVER:获取两个日期之间的总天数

sqlserver 写一个函数,能获取两个日期之间的周一到周五的总天数