【问题标题】:SQL Start date is current day then end date is 1 month ago even if its not from the first to the last of the monthSQL 开始日期是当天,结束日期是 1 个月前,即使它不是从该月的第一天到最后一个月
【发布时间】:2010-09-20 14:27:29
【问题描述】:

好的,我正在尝试编写一个查询,说明获取当前日期并将其设为开始日期。然后我想从当前日期返回一个月的 EndDate。是否有可能做到这一点?就像 2010 年 9 月 15 日作为开始日期一样,我可以从那个日期回溯到 2010 年 8 月 15 日,或者这不可能……你会为 2010 年 9 月 20 日作为开始日期做什么日期,因为每个月都有不同的天数?否则,如果这是不可能的,我还能怎么做?该报告将始终在每月 25 日运行,所以有什么想法吗?我需要从一个月的 25 号开始......如果需要,我可以在几个月之间获得一些重复的记录,但显然越少越好

现在我正在使用这个:

DECLARE @StartDate DATETIME,
 @EndDate DATETIME;

SET @StartDate = DATEADD(m,-1,GETDATE());
SET @EndDate = DATEADD(m, 1, @StartDate);

这行得通吗?

另外,我怎么会说我的 AuditInsertTimestamp 介于 @Start 和 @EndDate 之间?

目前我有这个:

AND cvn.[AuditInsertTimestamp] BETWEEN @StartDate AND @EndDate ;

不过,这仍然给了我 2010 年 7 月 26 日这样的日期......

谢谢!

【问题讨论】:

  • 2010 年 3 月 30 日的结束日期应该是什么时候?
  • 结束日期应该是 2010 年 2 月 30 日我认为...
  • lol touche....2 月 28 日那是我的问题,这几个月的天数不同。
  • 您是要查找一个月前的日期还是要选择记录?您似乎在问如何获取日期,然后提到获取记录。
  • 基本上,每次运行 rpeort 时我只需要返回 30 天,但我不想错过它运行的一天,但它可以重复几天。

标签: sql sql-server sql-server-2005


【解决方案1】:

那个should work.你试过了吗?

如果它不起作用(并且只有 12 个测试用例可以检查您是否不信任文档),那么您可以从 date parts 重新构建日期。

这就是问题所在。应该是这样的:

cvn.[Subject] = 'Field Changed (Plate Type)'
    AND (
        cvn.[Note] LIKE 'Old Type: IRP%New Type: BASE PLATE%'
        OR cvn.[Note] LIKE 'Old Type: Base Plate%New Type: IRP%'
    )
    AND cvn.AuditInsertTimestamp BETWEEN GETDATE() AND DATEADD(MONTH, -1, GETDATE()) 

AND 优先于 OR,因此您选择的是旧类型:IRP 或正确日期范围内的任何内容(旧类型:底板)

【讨论】:

  • 是的,我这样做了,然后我只是将我在 where 子句中使用的内容添加到了我的 OP 中,它仍然给了我像 2010 年 7 月 26 日这样的日期......
  • 作为一个测试用例,将这两个日期硬编码为您认为应该是的日期,然后再次运行查询。您还可以选择@StartDate 和@EndDate 来查看它们实际设置的值。 .. 和 .. 之间应该有效,尽管我认为它包含第一个日期,而第二个日期不包含。
  • @Start 和 @End 是正确的,但是当我说 AuditInsertTimestamp BETWEEN @Start AND @End 时,它没有给我正确的数据。
  • 您是在选择 AuditInsertTimeStamp 并且它不在范围内,还是将该日期基于表中的另一个字段? AuditInsertTimeStamp 也是 DateTime 对象吗?
  • 实际上我只是在 where 子句中调换了日期...现在知道了...再次感谢您。
【解决方案2】:

根据您的评论:

嗯,这是用来选择的 记录。所以如果我在 25 日运行它 需要30天回到我的领域 AuditInsertTimestamp 需要是 在这两个日期之间。

我认为你需要这样做:

SELECT * FROM Table
WHERE AuditInsertTimestamp BETWEEN GETDATE() AND DATEADD(MONTH, -1, GETDATE())

【讨论】:

  • 这仍然给我 2010-07-20 作为一些日期...hmmmm
  • 真的吗?当你只做SELECT GETDATE() 时会发生什么? AuditInsertTimestamp 的数据类型是什么?
  • AuditInsertTimestamp 是一个日期时间。并选择 getdate() = 2010-09-20 09:46:43.087
  • 我当前的查询在 OP 上面
猜你喜欢
  • 1970-01-01
  • 2022-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多