我想问3个关于下面的代码的问题(请原谅冗长的代码清单,我希望这些代码能够提供足够的上下文)。存储过程中的SQL Server日期计算
请注意,这里的代码取决于它执行的日期。出于这个原因,我的问题涉及到一个假设的情况有两种不同的执行日期:
- 2014年3月1日
- 2014年1月1日
我的问题是在我上的这一些地区的理解是否正确的,即:
A。该SELECT DATEADD
表达式(第1行)将:
- 在2014年3月1日创建的日期时间
2014-02-31 23:59:59
乙。上线码6-9将:
- 在2014年3月1日创建日期时间
2014-02-01 00:00:00
- 在2014年1月1日创建日期时间
2013-02-01 00:00:00
和
C。上线11-14的代码将:
- 在2014年3月1日创建日期时间
2015-01-30 00:00:00
- 在2014年1月1日创建日期时间
2014-01-30 00:00:00
这是理解是否正确?
1. SET @ldpmth = (SELECT DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE()),0)))
2. SET @yr = (SELECT YEAR(@ldpmth))
3. SET @mth = 0
4. SET @dy = 0
5.
6. SET @fysdate = (SELECT CASE WHEN MONTH(@ldpmth) >= 2 THEN
7. DATEADD(MM, 1,CAST(CAST(@[email protected][email protected] AS NVARCHAR(50)) AS DATETIME))
8. ELSE DATEADD(MM, 1, CAST(CAST((@yr-1)[email protected][email protected] AS NVARCHAR(50))
9. AS DATETIME)) END)
10.
11. SET @fyedate = (SELECT CASE WHEN MONTH(@ldpmth) >= 2 THEN
12. DATEADD(YY, 1, CAST(CAST(@[email protected][email protected] AS NVARCHAR(50)) AS DATETIME)) + 30
13. ELSE DATEADD(YY, 1, CAST(CAST((@yr-1)[email protected][email protected] AS NVARCHAR(50))
14. AS DATETIME)) + 30 END)
(谢谢所有谁迄今回答了。其实,这是在我工作的地方,几年前开发的(但没有记录)代码,我一直负责其转换为一个可行的形式客户端使用Crystal Reports)
为什么不能用'2014-03-01'代替'GETDATE()'并自己测试它们? – Kermit
对于问题A,你做错了。你可能试图捕获上个月发生的所有事情,并且你正在努力计算一个包容性的端点(目前排除了发生在那天的最后一分钟x毫秒内的任何事情) - 计算起来要容易得多当你处理连续时,一个*独占*上限。 –