Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tsql 其中日期\字段运算符月/日/(可变年)_Tsql_Date_Sql Server 2012_Content Management System_Where - Fatal编程技术网

Tsql 其中日期\字段运算符月/日/(可变年)

Tsql 其中日期\字段运算符月/日/(可变年),tsql,date,sql-server-2012,content-management-system,where,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日)他们的账户上可

我试图为每年的续约季节提取大于或等于10月1日(可变年)的发票。我每年都可以硬编码,但我不想这样做,因为SQL代码嵌入到CMS(netFORUM Enterprise)的子表单中,并通过另一个应用程序运行,这需要太多的部分才能跟上

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

WHERE my_date_field >= '10/01/2016'
注意,从2016年10月开始,以及2017年10月之前的2017个月内,我会使用此代码多次运行查询。请记住,两年前(2015年10月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_字段包含时间,则不要使用BETWEEN,而是>=和=DATEFROMPARTS(YEAR(GETDATE())-1,10,01) 和my_date_字段 或对于SQL Server 2012及更高版本:

WHERE my_date_field BETWEEN 
DATEFROMPARTS(YEAR(GETDATE()) - 1, 10, 01)
AND DATEFROMPARTS (YEAR(GETDATE()), 09, 30)
正如HABO所建议的,如果my_date_字段包含时间,则不要使用BETWEEN,而是>=和=DATEFROMPARTS(YEAR(GETDATE())-1,10,01) 和my_date_字段您可以拆分日、月、年,然后将年替换为当前年

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()))
或者您可以简单地将年份部分替换为当前部分

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

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

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()))
或者您可以简单地将年份部分替换为当前部分

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


你在使用什么数据库?编辑:我做了一些编辑,以帮助更好地理解这一点。很抱歉给您带来任何困惑。@splaten-sqlserver2012是答案的一半。如果你能根据
year(GetDate())
计算出合适的年份,那么Bob是你的叔叔。只需使用where过滤器(如Gordon Bell的回答)检查大于此类日期或介于两个日期之间的日期。你使用的是什么数据库?编辑:我做了一些编辑,以帮助更好地理解这一点。很抱歉给您带来任何困惑。@splaten-sqlserver2012是答案的一半。如果您可以根据
year(GetDate())
计算适当的年份,那么Bob是您的叔叔。只需使用where筛选器(如Gordon Bell的回答中所示)检查大于此日期或介于两个日期之间的日期。更新后将使用my_date_字段索引(如果有)。您可能希望切换到
DateFromParts()
由于各种原因。感谢您更改了原始答案,使之成功。@Gordon Bell-谢谢。。。因此,在您进行主要编辑之前,我使用了原始代码,得到了我所需要的,以及我实际需要的一些代码(相对于我的硬代码,有点奇怪),但对于您和HABO推荐的第三部分,我没有收到任何结果(只是专栏)。>挠头啊打字错误。现在试试。@Gordon Bell-拼写错误的更正提供了与硬代码相同的结果,这就是本文所要求的,也是我所需要的。非常感谢。。。顺便说一句,我明白了为什么您共享的原始拼写更正代码(在您主要编辑/添加三个版本之前)比硬代码提供了更多的结果。我的总体代码是拉入当前成员(提示续签),而不是第一次收到发票的新成员。当我用我的其他WHERE条件添加代码时,我忘了把OR的两边都放在括号中。。。其中(ME=DUH或ME=DOH)=PUpdated,因此将使用my_date_字段索引(如果有)。出于各种原因,您可能希望切换到
DateFromParts()
。感谢您更改了原始答案,使之成功。@Gordon Bell-谢谢。。。因此,在您进行主要编辑之前,我使用了原始代码,得到了我所需要的,以及我实际需要的一些代码(相对于我的硬代码,有点奇怪),但对于您和HABO推荐的第三部分,我没有收到任何结果(只是专栏)。>挠头啊打字错误。现在试试。@Gordon Bell-拼写错误的更正提供了与硬代码相同的结果,这就是本文所要求的,也是我所需要的。非常感谢。。。顺便说一句,我明白了为什么您共享的原始拼写更正代码(在您主要编辑/添加三个版本之前)比硬代码提供了更多的结果。我的总体代码是拉入当前成员(提示续签),而不是第一次收到发票的新成员。当我用我的其他WHERE条件添加代码时,我忘了把OR的两边都放在括号中。。。其中(ME=DUH或ME=DOH)=p谢谢,但是选中答案的第三部分有效。谢谢,但是选中答案的第三部分有效。