【问题标题】:How do I query for all dates greater than a certain date in SQL Server?如何在 SQL Server 中查询大于某个日期的所有日期?
【发布时间】:2012-05-25 11:34:01
【问题描述】:

我正在尝试:

SELECT * 
FROM dbo.March2010 A
WHERE A.Date >= 2010-04-01;

A.Date 看起来像:2010-03-04 00:00:00.000

但是,这不起作用。

谁能提供参考原因?

【问题讨论】:

  • 用单引号括起来
  • 除了引号之外,我建议始终对仅日期字符串文字使用安全且明确的格式。我唯一信任的是 YYYYMMDD。请参阅我对大卫回答的评论,了解原因...

标签: sql sql-server datetime


【解决方案1】:

尝试将您的日期包含在字符串中。

 select * 
 from dbo.March2010 A
 where A.Date >= '2010-04-01';

【讨论】:

  • 添加时间将给出准确的结果:其中 A.Date >= 2014-01-12 12:28:00
【解决方案2】:
select *  
from dbo.March2010 A 
where A.Date >= Convert(datetime, '2010-04-01' )

在您的查询中,2010-4-01 被视为数学表达式,因此本质上它是

select *  
from dbo.March2010 A 
where A.Date >= 2005; 

(2010 minus 4 minus 1 is 2005 将其转换为正确的datetime,并使用单引号将解决此问题。)

从技术上讲,解析器可能会让你侥幸逃脱

select *  
from dbo.March2010 A 
where A.Date >= '2010-04-01'

它会为你完成转换,但在我看来,它比显式转换为DateTime 的可读性更差,以便你之后的维护程序员。

【讨论】:

  • 不需要显式转换。另外我强烈建议使用 YYYYMMDD 而不是 YYYY-MM-DD。为什么?好吧,用SET LANGUAGE FRENCH 试试你的代码。 :-) 对于该日期,您将获得 1 月 4 日而不是 4 月 1 日。对于其他日期,您可能会收到错误消息。
  • @Aaron Bertrant - 我的回答确实包括不需要转换,从“从技术上讲,解析器可能会让你摆脱 。我只是觉得它更具可读性,因为很明显这是一个日期时间。太多的数据库系统将日期值存储在 varchar 字段中,但是您对格式是正确的。通常,在使用转换时,我也会添加格式说明符,但我是从头顶上做我的样本。
  • @AaronBertrand,我不得不将您的建议与上述答案结合使用:CONVERT(datetime, '20100401 10:01:01') - 传递 2010-04-01 在 SQL Server Management Studio 中有效,但在通过 PHP/发送 SQL 语句时无效/ MSSQL。
  • 我认为这是一个日期已经很清楚了,因此不需要转换。
  • 我无法在 BigQuery 中使用 Convert(datetime, '2010-04-01' )。如果有人希望在 BigQuery 中执行大于日期的函数,您可以按照下面链接中提到的答案link
【解决方案3】:
DateTime start1 = DateTime.Parse(txtDate.Text);

SELECT * 
FROM dbo.March2010 A
WHERE A.Date >= start1;

首先将 TexBox 转换为 Datetime 然后....将该变量用于查询

【讨论】:

    【解决方案4】:

    我们也可以像下面这样使用

    SELECT * 
    FROM dbo.March2010 A
    WHERE CAST(A.Date AS Date) >= '2017-03-22';
    
    SELECT * 
        FROM dbo.March2010 A
        WHERE CAST(A.Date AS Datetime) >= '2017-03-22 06:49:53.840';
    

    【讨论】:

    • 修改过滤谓词列不是一个好主意。它几乎完全阻止了索引的使用。
    【解决方案5】:

    总结一下,正确答案是:

    select * from db where Date >= '20100401'  (Format of date yyyymmdd)
    

    这将避免其他语言系统的任何问题,并将使用索引。

    【讨论】:

      【解决方案6】:

      日期格式对我来说没有问题(Mydate的数据类型是datetime):
      Where Mydate>'10/25/2021'Where Mydate>'2021-10-25'
      但如果添加时间,上述答案将不起作用。
      这是我的工作:
      where cast(Mydate as time)>'22:00:00'
      如果您的查询需要日期,请添加日期,例如:
      where cast(Mydate as time)>'22:00:00' and Mydate='10/25/2021'

      【讨论】:

        【解决方案7】:

        在您的查询中,您没有在日期前后使用单引号。这就是问题所在。然而, 您可以使用以下任何查询来比较日期

        SELECT * 
        FROM dbo.March2010 A
        WHERE A.Date >= '2010-04-01';
        
        
        SELECT * 
        FROM dbo.March2010 A
        WHERE A.Date >= CAST('2010-04-01' as Date);
        
        
        SELECT *  
        FROM dbo.March2010 A 
        WHERE A.Date >= Convert(datetime, '2010-04-01' )
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-08-29
          • 1970-01-01
          • 1970-01-01
          • 2023-04-10
          • 2013-01-16
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多