我试图为每年的续订季节提取大于或等于10月1日(可变年份)的发票。我可以每年对此进行硬编码,但我不想这样做,因为SQL代码嵌入在CMS(netFORUM Enterprise)的子形式中并运行在另一个应用程序中,而且这个部分太多而无法跟上。
因此,2016年开始的硬代码将如下所示:
WHERE my_date_field >= '10/01/2016'
请注意,我将从2016年10月开始以及2017年10月之前的2017个月内使用此代码运行此查询。请注意,某些旧发票可能仍会出现在其帐户中两年前(2015年10月1日),我不想出现在我的结果中。
我考虑过几种方法,但两种方法都无法得到它。
提前致谢!
答案 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()))