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