【问题标题】:How to select records which have date range with leap years?如何选择日期范围为闰年的记录?
【发布时间】:2015-03-30 21:46:50
【问题描述】:

我有像

这样结构的表
ID | Name | StartDate | EndDate

如何选择具有日期范围的记录,其中包含闰年?例如,日期范围从 2011-01-01 (StartDate) 到 2013-01-01 (EndDate) 的记录?此范围包含闰年。我使用 MS SQL。

谢谢。

【问题讨论】:

  • 请向我们展示您的尝试。
  • 此时我还没有任何想法,如何构建这个查询...
  • 您的意思是要测试 StartDate 和 EndDate 之间的范围是否包含闰年,或者 StartDate 或 EndDate 是否为闰年?
  • 测试 StartDate 和 EndDate 之间的范围是否包含闰年。
  • 尝试从 Select * from YourTableName 开始。然后开始添加 where 子句,例如“Where startdate >= '2011-01-01'”。您对 MS SQL 完全陌生吗?如果是这样,我建议阅读一些有关 MS SQL 查询基础的文章。我认为鲍勃想要达到的目的是,至少尝试一些东西。不要只要求别人做你所有的工作:-)

标签: sql sql-server sql-server-2008


【解决方案1】:

你可以创建一个表LeapYears,那么查询很简单:

SELECT t.*
FROM TableName t
WHERE EXISTS
(
   SELECT 1 FROM LeapYears ly
   WHERE ly.[Date] >= StartDate AND ly.[Date] <= EndDate
)

要创建LeapYear 表,您可以使用:

DECLARE @startYear int 
DECLARE @endYear int
SET @startYear = 2000
SET @endYear = 2030
CREATE  TABLE LeapYears(ID int IDENTITY(1,1), [Date] DATETIME)

DECLARE @currentYear int
SET @currentYear = @startYear
WHILE @currentYear <= @endYear
BEGIN
  DECLARE @yearStr char(4)
  SELECT @yearStr = CAST(@currentYear AS char(4))
  IF ISDATE(@yearStr + '0229') = 1  
     INSERT INTO LeapYears VALUES(@yearStr + '0229')
  SET @currentYear = @currentYear + 1
END

脚本创建这些记录:

ID  Date
1   2000-02-29 00:00:00.000
2   2004-02-29 00:00:00.000
3   2008-02-29 00:00:00.000
4   2012-02-29 00:00:00.000
5   2016-02-29 00:00:00.000
6   2020-02-29 00:00:00.000
7   2024-02-29 00:00:00.000
8   2028-02-29 00:00:00.000

【讨论】:

    【解决方案2】:

    我建议你编写一个存储过程来接收两个日期时间,并验证每一年是否是闰年。为此,您可以简单地执行 year mod 4 = 0。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-04
      • 1970-01-01
      • 1970-01-01
      • 2021-10-27
      • 2018-06-01
      • 2018-06-02
      相关资源
      最近更新 更多