【问题标题】:WHERE date_field OPERATOR Month/Day/(Variable Year)WHERE date_field OPERATOR 月/日/(变量年)
【发布时间】:2017-06-21 06:09:34
【问题描述】:

我正在尝试为每年的续订季节提取大于或等于 10 月 1 日(可变年份)的发票。我每年都可以硬编码,但我不想这样做,因为 SQL 代码嵌入在 CMS (netFORUM Enterprise) 的子窗体中,并通过另一个应用程序运行,而且部件太多,无法跟上。

因此,从 2016 年开始的硬代码如下所示:

WHERE my_date_field >= '10/01/2016'

注意,从 2016 年 10 月开始,以及 2017 年 10 月之前的整个 2017 年的几个月,我将使用此代码运行几次查询。请注意,他们的帐户中可能仍存在一些旧发票从两年前(2015 年 10 月 1 日)开始,我不想出现在我的结果中。

我琢磨过几种方法,都不太明白。

提前致谢!

【问题讨论】:

  • 你用的是什么数据库?
  • 编辑:我进行了一些编辑以帮助更好地理解这一点。很抱歉有任何混淆。
  • @SPlatten - SQL Server 2012
  • DateFromParts() 是答案的一半。如果您可以根据Year( GetDate() ) 计算出合适的年份,那么 Bob 就是您的叔叔。
  • 只需使用 where 过滤器(如 Gordon Bell 的回答)来检查大于这样的日期或两个日期之间的日期。

标签: tsql date sql-server-2012 content-management-system where


【解决方案1】:
WHERE my_date_field BETWEEN 
CONVERT(DATETIME, CONVERT(VARCHAR, YEAR(GETDATE()) - 1) + '-10-01')
AND CONVERT(DATETIME, CONVERT(VARCHAR, YEAR(GETDATE())) + '-09-30')

或对于 SQL Server 2012 及更高版本:

WHERE my_date_field BETWEEN 
DATEFROMPARTS(YEAR(GETDATE()) - 1, 10, 01)
AND DATEFROMPARTS (YEAR(GETDATE()), 09, 30)

并且正如 HABO 建议的那样,如果 my_date_field 包含时间,请不要使用 BETWEEN,而是使用 >= 和

WHERE my_date_field >= DATEFROMPARTS(YEAR(GETDATE()) - 1, 10, 01)
AND my_date_field < DATEFROMPARTS (YEAR(GETDATE()), 10, 01)

【讨论】:

  • 已更新,因此将使用 my_date_field 索引(如果有)。
  • 您可能出于各种原因想要切换到DateFromParts()。感谢您更改原始答案以使其成为SARGABLE
  • @Gordon Bell - 谢谢...所以我在您进行重大编辑之前使用了原始代码并得到了我需要的内容以及我实际需要的更多内容(相对于我的硬代码 - 有点奇怪),但我没有收到你和 HABO 推荐的第三部分的结果(只是列)。 > 挠头
  • 啊错字。立即尝试。
  • @ Gordon Bell - 对错字的更正提供了与硬代码相同的结果,这就是本文所要求的和我需要的。非常感谢! ...顺便说一句,我弄清楚了为什么您共享的原始错字更正代码(在您对三个版本进行主要编辑/添加之前)提供了比硬代码更多的结果。我的总体代码是拉入当前成员(提示更新),而不是使用首次发票的新成员。当我使用其他 WHERE 条件添加代码时,我忘记将 OR 的两边都放在括号中... WHERE (ME = DUH OR ME =DOH) =P
【解决方案2】:

您可以拆分日、月、年,然后将年份替换为当前年份。

SELECT my_date_field WHERE my_date_field >= CAST(
      CAST(DAY(my_date_field) AS NVARCHAR(2)) + '/' +
      CAST(MONTH(my_date_field) AS NVARCHAR(2)) + '/' + 
      CAST(YEAR(GETDATE())) AS DATE)

或者您可以简单地将年份部分替换为当前部分。

SELECT my_date_field WHERE my_date_field >= 
    REPLACE(my_date_field, YEAR(my_date_field), YEAR(GETDATE()))

【讨论】:

  • 谢谢,但检查答案的第三部分有效。
猜你喜欢
  • 1970-01-01
  • 2019-08-02
  • 1970-01-01
  • 2017-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-17
相关资源
最近更新 更多