Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.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
使用日期YYYY的类SQL语法_Sql_Sql Server_Syntax_Sql Like - Fatal编程技术网

使用日期YYYY的类SQL语法

使用日期YYYY的类SQL语法,sql,sql-server,syntax,sql-like,Sql,Sql Server,Syntax,Sql Like,我得到了一个项目财务报告系统的一部分工作。基本上,我正在尝试修改现有查询,以在包含可变日期格式的字段中按日期限制返回的结果 我的查询以YYYY格式从其他人的代码中发送了两次日期,例如2014年和2017年。在下面的SQL查询中,它们被列为2014年和2017年,因此您只需将它们想象为变量 数据库中具有可变日期表单的字段有两种形式:YYYYMMDD或YYYYMM 现有查询如下所示: SELECT 'Expense' AS Type,

我得到了一个项目财务报告系统的一部分工作。基本上,我正在尝试修改现有查询,以在包含可变日期格式的字段中按日期限制返回的结果

我的查询以YYYY格式从其他人的代码中发送了两次日期,例如2014年和2017年。在下面的SQL查询中,它们被列为2014年和2017年,因此您只需将它们想象为变量

数据库中具有可变日期表单的字段有两种形式:YYYYMMDD或YYYYMM

现有查询如下所示:

SELECT   
                    'Expense' AS Type,
                    dbo.Department.Description AS [Country Name],
                    dbo.JCdescription.Description AS Project,
                    dbo.Detail.AccountCode AS [FIN Code], 
                    dbo.JCdescription.ReportCode1 as [Phase Date Start], 
                    dbo.JCdescription.ReportCode2 as [Phase Date End], 
                    dbo.JCdescription.ReportCode3 as [Ratification Date], 
                    dbo.Detail.Year AS [Transaction Year], 
                    dbo.Detail.Period AS [Transaction Year Period], 
                    ...
                FROM
                    dbo.Detail
                INNER JOIN
                    ...
                WHERE
                    (dbo.Detail.LedgerCode = 'jc')
                ...
                AND
                    (dbo.Detail.Year) BETWEEN '2014 AND 2017";
理想情况下,我想将最后一行更改为:

(dbo.JCdescription.ReportCode2 LIKE '[2014-2017]%')
但它搜索的是所有数字2,0,1,4,5,而不是2014年至2017年间的所有数字

我肯定我错过了一些简单的东西,但我找不到!我意识到我可以将其重新表述为像“201[4567]%”这样的
,但这意味着2010-2020年以外的搜索将出错。。需要我开始解析发送的变量,这将引入一个额外的函数,该函数将被大量调用。我宁愿不做。我只需要将2014年和2017年这两个数字视为整数,而不是4位数

在MS SQL server 10.0.5520上运行使用

如果您的日期列是给定的任何一列,我想您可以使用系统函数

这将允许您编写类似以下内容的内容

where year(MyDateColumn) between 2014 and 2017
此外,如果要使用作为日期列数据类型,则必须将它们设置为适当的可比较值,并且还必须确保获得进行比较所需的唯一值

因此,假设在
dateStringColumn
中有类似“201505”的字符串值

where cast(substring(dateStringColumn, 1, 4) as int) between 2014 and 2017

因此,据我所知,您有两个用于筛选结果的开始年和结束年参数

如果日期为
yyyyymm
yyyyymmdd
,则可以使用字符串操作获取前4个字符,并将其转换为
INT
,然后可用于与参数进行比较

比如:

CREATE TABLE #detail ( id INT , SomeDate NVARCHAR(10) )
INSERT  INTO #detail
        ( id, SomeDate )
VALUES  ( 1, '201311' ),
        ( 2, '201402' ),
        ( 3, '20140313' ),
        ( 4, '201409' ),
        ( 5, '201506' ),
        ( 6, '20150912' ),
        ( 7, '201612' ),
        ( 8, '201701' ),
        ( 9, '20181212' )

DECLARE @startYear INT = 2014, @endYear INT = 2017

SELECT *, CONVERT(INT, (LEFT(SomeDate, 4))) AS [Year]
FROM #detail
WHERE CONVERT(INT, (LEFT(SomeDate, 4))) BETWEEN @startYear AND @endYear 

DROP TABLE #detail
根据样本数据,这将产生:

id  SomeDate    Year
====================
2   201402      2014
3   20140313    2014
4   201409      2014
5   201506      2015
6   20150912    2015
7   201612      2016
8   201701      2017

(不包括第1行和第9行)

您的ReportCode2是VARCHAR吗?现有代码有什么问题吗?1)方括号中的字符列表是一个字符集:--您现在缺少的是什么?在询问为什么它会像文档中所描述的那样准确地表现出来之前,我们会做出任何有意义的努力来找出它的含义。2) 无论如何,为什么要使用
一样检查日期范围<@begin和@end之间的code>是正确的。3) 作为一般规则:不要试图发明新的聪明方法来做显而易见的事情。在尝试彻底改变职业之前,先掌握基本知识。ReportCode2是VARCHAR-但预期的格式是INT,长度可以是6或8位。现有代码工作正常-但我们需要搜索不同的字段-ReportCode1。这给我们带来了更有意义的结果@EdPlunkett我完全愿意探索除“LIKE”之外的东西-我的问题不是关于日期检查,而是关于在一系列数字之间进行检查。因为
DATEPART
返回一个整数,你可能不想测试字符串值我没有注意到,因为我认为DATEPART是主要的解决方案。顺便说一句,再次感谢
id  SomeDate    Year
====================
2   201402      2014
3   20140313    2014
4   201409      2014
5   201506      2015
6   20150912    2015
7   201612      2016
8   201701      2017