【问题标题】:DateTime query on only year in SQL ServerSQL Server 中仅一年的 DateTime 查询
【发布时间】:2011-12-28 10:24:35
【问题描述】:

我想根据匹配年份选择多条记录,例如在表格选项卡中 其中列是[id] int[name] varchar[bookyear] datetime

我想选择年份为 2009 年的所有记录。

以下查询给出 0 个结果:

    SELECT [ACCNO]
      ,[Roll No]
      ,[IssueDate]
      ,[DueDate]
  FROM [test1].[dbo].[IssueHis$] 
  where [IssueDate]  between 12-12-2004 and 1-01-2010

【问题讨论】:

  • 如何同时标记mysql和sql-server?
  • 查看 DATEPART 函数 - msdn.microsoft.com/en-us/library/ms174420.aspx - 然后您可以执行 SELECT * FROM tab WHERE DATEPART(year, IssueDate) BETWEEN 2005 AND 2010 例如。也有很多关于 SO 的示例,请参阅 stackoverflow.com/questions/5043920/…
  • 我整理了@rene 的标签,因为很明显问题是关于 SQL Server 的。
  • @dash:您不会在 SQL Server 中的列上放置函数。它使索引使用无效
  • @user1074474:为什么说“2009 年”然后是“12-12-2004”?

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


【解决方案1】:
select id,name,bookyear from tab1 where year(bookyear) = 2009

【讨论】:

  • Qeustion 已编辑:当我阅读时,只有这样我想选择年份为 2009 年的所有记录。所以我的查询服务器就是这个目的。
【解决方案2】:
SELECT [ACCNO]
    ,[Roll No]
    ,[IssueDate]
    ,[DueDate]
FROM [test1].[dbo].[IssueHis$] 
WHERE [IssueDate] >= '20090101' AND
      [IssueDate] < '20100101'

【讨论】:

    【解决方案3】:
    1. 您需要像使用字符串一样分隔日期时间常量
    2. 对 SQL Server 使用yyyymmdd 模式(不是yyyy-mm-dd,一般不安全)
    3. 使用适当的范围查询以允许时间值

    因此,要找到介于“2004 年 12 月 12 日”和“2009 年 12 月 31 日”之间的值,考虑到时间:

    ...
    where [IssueDate] >= '20041212' AND [IssueDate] < '20100101'
    

    编辑,或者这个,因为“year = 2009”的问题含糊不清

    ...
    where [IssueDate] >= '20090101' AND [IssueDate] < '20100101'
    

    【讨论】:

    • +1 用于解释,另外,感谢您提到函数可能会对查询性能与索引产生负面影响。我不知道所以要去读一读:-)
    • @dash:这里是第 2 号 simple-talk.com/sql/t-sql-programming/…
    【解决方案4】:

    关于 SQL Server 和日期,要记住的最重要的事情之一是使用的最佳格式是:'YYYYMMDD'(或'YYYYMMDD HH:MI:SS')。无论区域日期设置如何,SQL Server 都将始终正确解释此格式。

    SELECT [ACCNO] 
          ,[Roll No] 
          ,[IssueDate] 
          ,[DueDate] 
      FROM [test1].[dbo].[IssueHis$]  
     WHERE [IssueDate] >= '20090101' 
       AND [IssueDate] < '20100101'
    

    【讨论】:

      【解决方案5】:

      您可以创建一个视图,将 IssueYear 作为单独的列

      CREATE VIEW vIssueHis
      AS
      SELECT
      [ACCNO],
      [Roll No],
      [IssueDate],
      [DueDate],
      DATEPART(yyyy,IssueDate) as IssueYear,
      DATEPART(yyyy,DueDate) as DueYear
      FROM [test1].[dbo].[IssueHis$]

      然后你可以像这样查询视图

      SELECT [ACCNO]
            ,[Roll No]
            ,[IssueDate]
            ,[DueDate]
      FROM vIssueHis
      WHERE IssueYear = 2009

      【讨论】:

        【解决方案6】:

        你可以的

        ....
        WHERE [IssueDate] > '2004' AND [IssueDate] < 2010
        

        【讨论】:

          【解决方案7】:
          where YEAR(IssueDate) = '2009'
          

          Reference

          【讨论】:

            【解决方案8】:

            是的,如果您尝试这个查询:

            SELECT to_date ('2008','yyyy') AS my_date, SYSDATE FROM dual;
            

            日期将是年份(2008 年)和当前月份(今天是 11 月),日期为 1,因此您的查询不包括 2008 年的所有月份。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2014-04-25
              • 1970-01-01
              • 2023-03-17
              • 1970-01-01
              • 1970-01-01
              • 2010-09-07
              • 1970-01-01
              相关资源
              最近更新 更多