我已经获得了项目财务报告系统的一部分。基本上,我试图修改现有查询,以便在包含可变日期格式的字段中按日期限制返回的结果。
我的查询是以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年之间的所有数字。
我确定我必须在这里遗漏一些简单的东西,但我无法找到它!我意识到我可以将其改写为LIKE '201[4567]%'
,但这意味着2010-2020之外的搜索将会出错...并且要求我开始解析所发送的变量,这将引入一个将被调用的附加函数。我宁愿不这样做。我只需要将2014年和2017年这两个数字视为整数而不是4位数!
在MS SQL Server 10.0.5520上运行
答案 0 :(得分:1)
因此,根据我的理解,您有2个参数用于开始和结束年份,用于过滤结果。
如果日期为YYYYMM
或YYYYMMDD
,您可以使用字符串操作获取前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行)
答案 1 :(得分:0)
使用。DATEPART
datepart(year,dbo.Detail.Year) BETWEEN 2014 AND 2017;
答案 2 :(得分:0)
如果您的日期列是给定的year中的任何一个,我猜您可以使用date or datetime data types available in SQL Server系统函数。
这将允许您编写与以下内容非常相似的内容。
where year(MyDateColumn) between 2014 and 2017
此外,如果您使用varchar作为日期列数据类型,则必须cast将它们设置为适当且可比较的值,并且您还必须确保获得比较所需的唯一substring。
因此,假设您有类似于' 201505'的字符串值。在dateStringColumn
。
where cast(substring(dateStringColumn, 1, 4) as int) between 2014 and 2017