使用日期YYYY的SQL语法

时间:2015-03-16 15:33:57

标签: sql sql-server syntax sql-like

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

我的查询是以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上运行

3 个答案:

答案 0 :(得分:1)

因此,根据我的理解,您有2个参数用于开始和结束年份,用于过滤结果。

如果日期为YYYYMMYYYYMMDD,您可以使用字符串操作获取前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