我有一些报告运行,显示数据MTD
这是不起作用的代码,我希望
StartDate = select dateadd(s,0,dateadd(mm, datediff(m,0,getdate()),0))
EndDate = getdate()
我们的数据复制发生在每天结束时。因此,在每个月的第一天,我不希望运行一份空白报告。
我希望发生的事情。
仅如果是本月的第一天,则StartDate必须是上个月的开始,EndDateStartDate = select dateadd(s,0,dateadd(mm, datediff(m,0,getdate()),0)) and
EndDate = getdate()
不完全确定您的主查询。这就是你如何获得上个月的第一天和最后一天,取决于给定的日期是当月的第一天。
请注意,每个事例表达式的else部分设置第一个和最后一个日期的当前日期。如果需要,可以将它们设置为null
。
DECLARE @Today DATETIME = GETDATE()
DECLARE @FirsDay DATETIME = CASE WHEN DATEPART(DAY, @Today) = 1
THEN DATEADD(MONTH, -1, @Today) --first day of last month
ELSE @Today END --current date for other dates
DECLARE @LastDay DATETIME = CASE WHEN DATEPART(DAY, @Today) = 1
THEN DATEADD(DAY, -1, @Today) --last date of last month
ELSE @Today END --current date for other dates
谢谢大家。所以兔子洞更深了一点例如:星期六第一天是什么时候?
如果是新月份的第一天,我需要它在最后一个交易日运行。
我最终使用的是一个使用我们的工作时间表的函数
ALTER FUNCTION [data].[Last_Trade_Day] (@Date date)
returns date as
begin
declare @OrigDate date = isnull(@Date, getdate())
return (
select max(convert(date, wh_starttime))
from Embrace.fact.Working_Hours
where convert(date, wh_starttime) < @OrigDate
)
end
报告中的代码现在看起来像:
declare @EndDate date = Embrace.data.Last_Trade_Day(isnull(@Date, getdate()))
declare @StartDate date = dateadd(mm, 0, dateadd(mm, datediff(m, 0, @EndDate), 0))
您可以尝试使用以下内容:
-- Create demo data
CREATE TABLE #dates(get_date_simulation datetime)
INSERT INTO #dates(get_date_simulation)
VALUES (N'2015-07-01 13:46:47.063'), -- fallback to 2015-06-01
(N'2015-07-02 13:46:47.063') -- use this date normal
-- Your part
SELECT get_date_simulation,
CASE
WHEN DATEPART(day,get_date_simulation) = 1
THEN DATEADD(month,-1,DATEADD(day,(DATEPART(day,get_date_simulation)-1)*-1,get_date_simulation))
ELSE DATEADD(day,(DATEPART(day,get_date_simulation)-1)*-1, get_date_simulation)
END as start_date,
CASE
WHEN DATEPART(day,get_date_simulation) = 1
THEN DATEADD(second,-1,CONVERT(datetime,CONVERT(date,get_date_simulation)))
ELSE get_date_simulation
END as end_date
FROM #dates
-- Cleanup
DROP TABLE #dates
结果是:
get_date_simulation start_date end_date
----------------------- ----------------------- -----------------------
2015-07-01 13:46:47.063 2015-06-01 13:46:47.063 2015-06-30 23:59:59.000
2015-07-02 13:46:47.063 2015-07-01 13:46:47.063 2015-07-02 13:46:47.063
对我来说,这似乎就像从当前日期减去1天来获得开始日期一样简单
SELECT StartDate =
DATEADD(s,0,DATEADD(mm,DATEDIFF(m,0,GETDATE() - 1),0))
然后你只需要使用当前日期而不使用时间来获得结束日期
SELECT EndDate =
CONVERT(DATE, GETDATE()
那么您的查询是WHERE date >= StartDate and < EndDate