【发布时间】:2013-06-27 21:25:26
【问题描述】:
我想就以下代码提出 3 个问题(请原谅冗长的代码清单,我将这些行包括在内是希望它提供足够的上下文)。
请注意,此处的代码取决于执行日期。出于这个原因,我的问题涉及两个不同执行日期的假设情况:
- 2014 年 3 月 1 日
- 2014 年 1 月 1 日
我的问题是我对其中某些部分的理解是否正确,即:
一个。 SELECT DATEADD 表达式(在第 1 行)将:
- 在 2014 年 3 月 1 日 创建日期时间
2014-02-31 23:59:59
B。第 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(@yr+@mth+@dy AS NVARCHAR(50)) AS DATETIME))
8. ELSE DATEADD(MM, 1, CAST(CAST((@yr-1)+@mth+@dy AS NVARCHAR(50))
9. AS DATETIME)) END )
10.
11. SET @fyedate = (SELECT CASE WHEN MONTH(@ldpmth) >= 2 THEN
12. DATEADD(YY, 1, CAST(CAST(@yr+@mth+@dy AS NVARCHAR(50)) AS DATETIME)) + 30
13. ELSE DATEADD(YY, 1, CAST(CAST((@yr-1)+@mth+@dy AS NVARCHAR(50))
14. AS DATETIME)) + 30 END )
(感谢到目前为止所有回答的人。这实际上是几年前在我的工作地点开发(但未记录)的代码,我的任务是将其转换为可在客户端使用的表单水晶报表。)
【问题讨论】:
-
为什么不能用
2014-03-01替换GETDATE()并自己测试这些? -
问A,你做错了。您可能正在尝试捕获上个月发生的所有事情,并且您正在努力计算一个包容性端点(目前排除当天最后一分钟 x 毫秒内发生的任何事情) - 计算起来要容易得多处理 continua 时的独占上限。
标签: sql-server tsql stored-procedures