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格式听起来很不错