如何使用Transact SQL自动执行查询中的日期更改

时间:2019-06-20 02:14:49

标签: sql sql-server tsql

我在一家公司工作,每天我都会通过更改前一天的日期来修改查询,因为报告始终是前一天的。 我想自动更改日期。我制作了一个包含两列的表格,其中一列列出了今年的所有日期,另一列列出了一些位,如果0是工作日,则1如果是假期。

通过告诉前一天是否是工作日,然后从日期中减去1(这是每天发生的事情),我已经成功地实现了一点自动化。但是问题在于,如果星期一显示为星期五,因为星期六和星期日不收费。我们还要说,如果今天是星期四,星期三和星期二,我们是假期,那么报告将在星期一运行。我要给你留下一张图片,说明这张桌子是如何用日期制成的。

请记住,如果一周中没有假期,则总是减去1。

the image is not updated because I took it from a group

2 个答案:

答案 0 :(得分:1)

执行此类操作的方法与您已完成的操作很接近,但可以进一步扩展。创建一个包含每个日期的BusinessDate表,然后包含在其中实现的每个规则。您甚至可以加入诸如ReportDate之类的列,该列将针对每个日期返回报告应在哪个日期运行。

执行一次,它将永远有效。您可能需要每年更新一次,以便以后的假期,但要比每天更新一次!

它还允许您更新特定于业务的内容,例如季度日期,公司假期等。

如果您想进一步了解该主题,请查找有关在数据仓库中创建日期维度的主题。这是您面临的一般问题。

答案 1 :(得分:0)

评论太复杂,涉及很多猜测。

因此,每天您的流程首先要确定“今天”是否为工作日。因此,您将执行以下操作:

if exists (select * from <calendar> where date = cast (getdate() as date) and IsWorkday = 1")
begin
    <do stuff> 
end; 

然后,“执行任务”部分将使用当前日期之前的最新工作日运行报告或您的查询(或不太清楚的内容)。您可以使用以下方式找到该日期:

declare @targetdate date; 
set @targetdate = (select max(date) from <calendar> 
    where date < cast (getdate() as date) 
    and IsWorkday = 1); 

if @targetdate is not null 
   <run your query using @targetdate>

可以将其压缩为更少的代码,但逐步编写逻辑时更容易理解。