WHERE date_field OPERATOR月/日/(可变年)

时间:2017-02-03 19:21:21

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

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

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

WHERE my_date_field >= '10/01/2016'

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

我考虑过几种方法,但两种方法都无法得到它。

提前致谢!

2 个答案:

答案 0 :(得分:2)

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)

答案 1 :(得分:0)

您可以拆分日,月,年,然后用当前的年份替换年份。

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()))