sql - 如何使用sql server获取一周中的上一个工作日与当前工作日

标签 sql sql-server

我有一个在工作日(周一至周五)运行的 ssis 套餐。如果我在星期二收到文件,后台(DB),它需要前一个工作日的日期并进行一些交易。如果我在周五运行该作业,它必须获取周一的日期并处理事务。

我使用以下查询来获取之前的营业日期

Select Convert(varchar(50), Position_ID) as Position_ID,
       TransAmount_Base,
       Insert_Date as InsertDate
  from tblsample
 Where AsOfdate = Dateadd(dd, -1, Convert(datetime, Convert(varchar(10), '03/28/2012', 101), 120))
Order By Position_ID

如果我执行这个查询,我将得到昨天 Transactios 的结果。如果我在星期一运行相同的查询,它必须获取星期五的交易而不是星期日的交易。

最佳答案

SELECT  DATEADD(DAY, CASE DATENAME(WEEKDAY, GETDATE()) 
                        WHEN 'Sunday' THEN -2 
                        WHEN 'Monday' THEN -3 
                        ELSE -1 END, DATEDIFF(DAY, 0, GETDATE()))

DATEPART 相比,我更喜欢使用 DATENAME 来处理类似的事情,因为它不需要设置 DATEFIRST 并确保时间上的变化/本地计算机上的日期设置不会影响结果。最后,DATEDIFF(DAY, 0, GETDATE()) 将删除 GETDATE() 的时间部分,从而无需转换为 varchar(慢得多)。

<小时/>

编辑(近两年了)

这个答案是我职业生涯的早期,每次它被投票时我都会很恼火,因为我不再同意使用 DATENAME 的观点。

更可靠的解决方案是:

SELECT  DATEADD(DAY, CASE (DATEPART(WEEKDAY, GETDATE()) + @@DATEFIRST) % 7 
                        WHEN 1 THEN -2 
                        WHEN 2 THEN -3 
                        ELSE -1 
                    END, DATEDIFF(DAY, 0, GETDATE()));

这适用于所有语言和 DATEFIRST 设置。

关于sql - 如何使用sql server获取一周中的上一个工作日与当前工作日,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9922756/

相关文章:

mysql - SQL SELECT 请求使用 count(*) 和多个 GROUP BY

mysql - SQL:如何使用另一个表中的信息选择某些内容

sql-server - VS2012 - "Show Table Data"

mysql - SQL - 将一个表中多个列中的两行匹配到另一个表中的 1 行。

mysql - 我需要有关 mysql 查询的帮助

sql - 使用条件计算postgresql中的百分比

mysql - sql 使用 count with group by 和 having

sql-server - SQL Server 的开发版是否允许您拥有多个用户?

sql-server - 选择在 24 小时时间范围内创建的记录

sql-server - 如何在 Node.js 中加密到 SQL Server 的连接