Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/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
Sql server 2005 更好的方法?让查询中的日期始终使用当前年份中的日期而不进行维护_Sql Server 2005 - Fatal编程技术网

Sql server 2005 更好的方法?让查询中的日期始终使用当前年份中的日期而不进行维护

Sql server 2005 更好的方法?让查询中的日期始终使用当前年份中的日期而不进行维护,sql-server-2005,Sql Server 2005,在几个子查询中,我需要检查日期是否在可接受的范围内。我需要避免使用简单常量,因为我真的不想在每个新学年更新它或配置文件 我目前的解决方案是在查询中输入日期,并使用一些复杂的DATEADD技巧将当前年份(或上一年)转换为我在比较中使用的日期。确切的代码在上面。有没有更干净的方法让我这么做 谢谢 编辑 业务要求是查找在2001年3月至31年7月之间提交的申请 我们正在进行背景调查,每次调查都要花钱。确定在此期间提交的申请有助于我们确定是否应该进行全面、部分或不进行背景调查。我还需要检查上一年的日期

在几个子查询中,我需要检查日期是否在可接受的范围内。我需要避免使用简单常量,因为我真的不想在每个新学年更新它或配置文件

我目前的解决方案是在查询中输入日期,并使用一些复杂的
DATEADD
技巧将当前年份(或上一年)转换为我在比较中使用的日期。确切的代码在上面。有没有更干净的方法让我这么做

谢谢

编辑

业务要求是查找在2001年3月至31年7月之间提交的申请

我们正在进行背景调查,每次调查都要花钱。确定在此期间提交的申请有助于我们确定是否应该进行全面、部分或不进行背景调查。我还需要检查上一年的日期

我们每年都会这样做,我们需要知道他们是否在今年。我不想每年维护查询以更新日期


因此,我正在寻找一种很好的技术,使日期的年份部分保持相关性,而不必更新查询或配置文件。

旧的TSQL技巧:将日期转换为以四位数年份开头的字符串,使用子字符串获取该日期的前四个字符,再将其转换回日期


实际上,这是一个旧的TSQL技巧的原因是,如果我没记错的话,那时候没有year()函数。考虑到现在有一个年份,使用year(getdate())可能是更好的答案。

旧的TSQL技巧:将日期转换为以四位数年份开头的字符串,使用子字符串将其前四个字符转换回日期


实际上,这是一个旧的TSQL技巧的原因是,如果我没记错的话,那时候没有year()函数。考虑到现在有一个变量,使用year(getdate())可能是更好的答案,正如其他人所回答的那样。

考虑保留一组
datetime
变量有助于可读性和可维护性。我不确定我是否已经抓住了你所有的需求,特别是关于“上一年”的需求。如果只需查找在2001年3月至31月7日之间提交的申请,那么这应该是可行的。如果您需要确定从去年8月1日到今年2月28日提交的解决方案,可以修改此解决方案以适应

SELECT Date_Received, DateAdd(Year, DateDiff(year, Cast('3/01/2010 12:00:00AM' as DateTime) , 
    GetDate())-1, Cast('3/01/2010 12:00:00AM' as DateTime)) as minimum_date
FROM [Volunteers].[dbo].[Applications]
WHERE Date_received >= DateAdd(Year, DateDiff(year, Cast('3/01/2010 12:00:00AM' as DateTime),
GetDate())-1, Cast('3/01/2010 12:00:00AM' as DateTime))

考虑保留一组
datetime
变量,以帮助提高可读性和可维护性。我不确定我是否已经抓住了你所有的需求,特别是关于“上一年”的需求。如果只需查找在2001年3月至31月7日之间提交的申请,那么这应该是可行的。如果您需要确定从去年8月1日到今年2月28日提交的解决方案,可以修改此解决方案以适应

SELECT Date_Received, DateAdd(Year, DateDiff(year, Cast('3/01/2010 12:00:00AM' as DateTime) , 
    GetDate())-1, Cast('3/01/2010 12:00:00AM' as DateTime)) as minimum_date
FROM [Volunteers].[dbo].[Applications]
WHERE Date_received >= DateAdd(Year, DateDiff(year, Cast('3/01/2010 12:00:00AM' as DateTime),
GetDate())-1, Cast('3/01/2010 12:00:00AM' as DateTime))
会给你今年的


将为您提供当前年份。

您有什么理由不能简单地使用该功能吗

 SELECT YEAR(GETDATE())
另一种方法是使用公共表表达式

Select Date_Received
        , Year(GetDate()) 
                - Year('3/01/2010 12:00:00AM') - 1 
                + Year('3/01/2010 12:00:00AM')
From [Volunteers].[dbo].[Applications]
Where Date_received >= ( Year(GetDate()) 
                        - Year('3/01/2010 12:00:00AM') - 1 
                        + Year('3/01/2080 12:00:00AM') )

有什么原因不能简单地使用该函数吗

 SELECT YEAR(GETDATE())
另一种方法是使用公共表表达式

Select Date_Received
        , Year(GetDate()) 
                - Year('3/01/2010 12:00:00AM') - 1 
                + Year('3/01/2010 12:00:00AM')
From [Volunteers].[dbo].[Applications]
Where Date_received >= ( Year(GetDate()) 
                        - Year('3/01/2010 12:00:00AM') - 1 
                        + Year('3/01/2080 12:00:00AM') )

如果您需要大量查询月份和年份,还应该考虑将这些属性转换为持久的、计算字段:

With Years As
    (
    Select Year(GetDate()) As CurrentYear
        , Year('3/01/2010 12:00:00AM') As ParamYear
        , Year('3/01/2080 12:00:00AM') As BoundaryYear
    )
Select Date_Received
    , CurrentYear - Years.ParamYear - 1 + Years.ParamYear
From [Volunteers].[dbo].[Applications]
    Cross Join Years
Where Date_received >= ( Years.CurrentYear 
                            - Years.ParamYear - 1 + Years.BoundaryYear )
SQL Server现在将提取您收到的
日期的月份和年份部分
,并将它们放入两个新列中。这些数据将被持久化,例如与表数据一起存储。SQL Server将确保它们自动保持最新,例如,如果更改
date\u Received
,将重新计算这两个新列(但不是在每次选择时)

现在,您的查询可能会简单得多:

ALTER TABLE dbo.Applications
    ADD DateReceivedMonth AS MONTH(Date_Received) PERSISTED

ALTER TABLE dbo.Applications
    ADD DateReceivedYear AS YEAR(Date_Received) PERSISTED

由于这些字段是持久化字段,您甚至可以在它们上添加索引以加快对它们的查询

> P>如果你需要大量的查询,你也应该考虑把这些属性变成持久的、计算的字段:

With Years As
    (
    Select Year(GetDate()) As CurrentYear
        , Year('3/01/2010 12:00:00AM') As ParamYear
        , Year('3/01/2080 12:00:00AM') As BoundaryYear
    )
Select Date_Received
    , CurrentYear - Years.ParamYear - 1 + Years.ParamYear
From [Volunteers].[dbo].[Applications]
    Cross Join Years
Where Date_received >= ( Years.CurrentYear 
                            - Years.ParamYear - 1 + Years.BoundaryYear )
SQL Server现在将提取您收到的
日期的月份和年份部分
,并将它们放入两个新列中。这些数据将被持久化,例如与表数据一起存储。SQL Server将确保它们自动保持最新,例如,如果更改
date\u Received
,将重新计算这两个新列(但不是在每次选择时)

现在,您的查询可能会简单得多:

ALTER TABLE dbo.Applications
    ADD DateReceivedMonth AS MONTH(Date_Received) PERSISTED

ALTER TABLE dbo.Applications
    ADD DateReceivedYear AS YEAR(Date_Received) PERSISTED

由于这些字段是持久化字段,您甚至可以在它们上添加索引以加快对它们的查询

TSQL函数根据年份返回四位数的年份。这与标准SQL YEAR函数的行为非常相似,可以使用高级选项上的sp_configure对其进行调整,但是,下面的代码是作为定制需求的框架提供的,可以根据需要进行修改。e、 g.返回int,与SQL中的标准DATETIME函数一起使用,以实现所需的功能。e、 g.在处理我必须迁移的“脏”数据时,我将其与PATINDEX()函数一起用于去除非数值等

SELECT (list of fields)
FROM dbo.Applications
WHERE DateReceivedYear = 2010 AND DateReceivedMonth BETWEEN 3 AND 7

TSQL函数根据年份返回四位数的年份。这与标准SQL YEAR函数的行为非常相似,可以使用高级选项上的sp_configure对其进行调整,但是,下面的代码是作为定制需求的框架提供的,可以根据需要进行修改。e、 g.返回int,与SQL中的标准DATETIME函数一起使用,以实现所需的功能。e、 g.在处理我必须迁移的“脏”数据时,我将其与PATINDEX()函数一起用于去除非数值等

SELECT (list of fields)
FROM dbo.Applications
WHERE DateReceivedYear = 2010 AND DateReceivedMonth BETWEEN 3 AND 7

20或120应该可以做到这一点;是的,我已经有好几年没有接触过TSQL了,但是120格式听起来很不错。20或120应该可以;是的,我已经有几年没有接触过TSQL了,但是120格式听起来很不错