显示当前日期和两个特定日期之间天数的 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 查询的主要内容,如果未能解决你的问题,请参考以下文章