【问题标题】:How to query DATETIME field using only date in Microsoft SQL Server?如何在 Microsoft SQL Server 中仅使用日期查询 DATETIME 字段?
【发布时间】:2014-04-25 18:15:51
【问题描述】:

我有一个带有 DATETIME 字段的表 TEST,如下所示:

ID NAME DATE
1 TESTING 2014-03-19 20:05:20.000

我需要一个查询来返回这一行以及日期为 2014 年 3 月 19 日的每一行,无论时间是什么。我尝试使用

select * from test where date = '03/19/2014';

但它不返回任何行。我发现使它工作的唯一方法是还提供日期的时间部分:

select * from test where date = '03/19/2014 20:03:02.000';

【问题讨论】:

    标签: sql-server datetime


    【解决方案1】:

    试试这个

     select * from test where Convert(varchar, date,111)= '03/19/2014'
    

    【讨论】:

      【解决方案2】:

      使用范围或 DateDiff 函数

       select * from test 
       where date between '03/19/2014' and '03/19/2014 23:59:59'
      

       select * from test 
       where datediff(day, date, '03/19/2014') = 0
      

      其他选项有:

      1. 如果您可以控制数据库架构,并且不需要 时间数据,拿出来。

      2. 或者,如果必须保留它,请添加一个计算列属性,该属性将删除日期值的时间部分...

      Alter table Test Add DateOnly As DateAdd(day, datediff(day, 0, date), 0)

      或者,在 SQL Server 的更新版本中...

      Alter table Test Add DateOnly As Cast(DateAdd(day, datediff(day, 0, date), 0) as Date)

      然后,您可以简单地编写查询:

      select * from test 
      where DateOnly = '03/19/2014'
      

      【讨论】:

      • 好的,这可行,但我想知道是否有更简单的方法。
      • 好吧,唯一更简单的方法是首先不将时间数据放入数据库中......或者创建一个计算属性来剥离时间部分并使用它......我添加了我的答案的两个选项。
      • 我担心 DATEDIFF 方法会在 2014 年 4 月 19 日或 2015 年 3 月 19 日这样的日期返回 true(不受欢迎),因为这些日期的“日”部分是相同的(并且我曾在其他地方看到报告说它会以这种方式运行),但我在数据库中对其进行了测试,它似乎工作正常。
      • 是的,因为DateDiff() 函数在其所有变体中都会计算并返回从一个日期到另一个日期必须跨越的日期边界 的数量。这就是为什么DateDiff(day, '1Jan2016', '31Dec2017 23:259:59')DateDiff(day, '31Dec2016 23:259:59', '1Jan2017 ') 都返回1
      【解决方案3】:

      您可以使用这种截断时间部分的方法:

      select * from test
      where convert(datetime,'03/19/2014',102) = DATEADD(dd, DATEDIFF(dd, 0, date), 0)
      

      【讨论】:

        【解决方案4】:

        你可以试试这个

        select * from test where DATEADD(dd, 0, DATEDIFF(dd, 0, date)) = '03/19/2014';
        

        【讨论】:

        • 谢谢,但我认为更简单的解决方案是与时间进行比较,就像之前的解决方案一样。
        【解决方案5】:

        简单的答案;

        select * from test where cast ([date] as date) = '03/19/2014';
        

        【讨论】:

        • 虽然这是一个有效的答案,但我想指出将日期字段评估放在任何函数后面都会导致性能问题。日期上的任何索引都是无用的,引擎需要评估每一行
        【解决方案6】:

        我使用的是 MySQL 5.6,并且有一个 DATE 函数可以仅从日期时间中提取日期部分。所以这个问题的简单解决方案是 -

         select * from test where DATE(date) = '2014-03-19';
        

        http://dev.mysql.com/doc/refman/5.6/en/date-and-time-functions.html

        【讨论】:

        • 问题是关于sql server的
        • 这为我解决了;尽管问题引用了 sql server,但 Google 通常会重定向到此处作为“SQL”的最高结果;这么多登陆这里的用户可能不是专门使用 MSS。
        【解决方案7】:
        -- Reverse the date format
        -- this false:
            select * from test where date = '28/10/2015'
        -- this true:
            select * from test where date = '2015/10/28'
        

        【讨论】:

        • 请在你的回答中添加一些解释!
        • 这不起作用,因为 '2015/10/28 00:00.001' 与 '2015/10/28' 不同
        【解决方案8】:

        日期和语言有问题,避免它的方法是要求日期格式为 YYYYMMDD。

        根据下面的链接,下面的这种方式应该是最快的。我签入了 SQL Server 2012 并同意该链接。

        select * from test where date >= '20141903' AND date < DATEADD(DAY, 1, '20141903');
        

        【讨论】:

        • 这应该是答案!
        【解决方案9】:
        select * from test 
        where date between '03/19/2014' and '03/19/2014 23:59:59'
        

        这是一个非常糟糕的答案。有两个原因。

        1。 像 23.59.59.700 等时间会发生什么。 有大于 23:59:59 和次日的时间。

        2。 行为取决于数据类型。 对于 datetime/date/datetime2 类型,查询的行为有所不同。

        使用 23:59:59.999 进行测试会使情况变得更糟,因为根据日期类型,您会得到不同的四舍五入。

        select convert (varchar(40),convert(date      , '2014-03-19 23:59:59.999'))
        select convert (varchar(40),convert(datetime  , '2014-03-19 23:59:59.999'))
        select convert (varchar(40),convert(datetime2 , '2014-03-19 23:59:59.999'))
        

        -- 对于日期,该值是“切碎的”。 -- 对于 datetime,该值向上舍入到下一个日期。 (最接近的值)。 -- datetime2 的值是精确的。

        【讨论】:

          【解决方案10】:

          测试这个查询。

          SELECT *,DATE(chat_reg_date) AS is_date,TIME(chat_reg_time) AS is_time FROM chat WHERE chat_inbox_key='$chat_key' 
                                   ORDER BY is_date DESC, is_time DESC
          

          【讨论】:

            【解决方案11】:

            只需在 WHERE 子句中使用它即可。

            下面的“SubmitDate”部分是列名,因此请插入您自己的。

            这将只返回结果的“年份”部分,省略分钟等。

            Where datepart(year, SubmitDate) = '2017'
            

            【讨论】:

              【解决方案12】:
              select * from invoice where TRANS_DATE_D>= to_date  ('20170831115959','YYYYMMDDHH24MISS')
              and TRANS_DATE_D<= to_date  ('20171031115959','YYYYMMDDHH24MISS');
              

              【讨论】:

              • 我认为这是Oracle语法,不要在sql server上工作
              【解决方案13】:

              这适用于我的 MS SQL 服务器:

              select * from test
              where 
              year(date) = 2015
              and month(date) = 10
              and day(date)= 28 ;
              

              【讨论】:

                【解决方案14】:
                select *, cast ([col1] as date) <name of the column> from test where date = 'mm/dd/yyyy'
                

                “col1”是包含日期和时间的列的名称
                在这里您可以根据需要更改名称

                【讨论】:

                  【解决方案15】:
                  select *
                    from invoice
                   where TRUNC(created_date) <=TRUNC(to_date('04-MAR-18 15:00:00','dd-mon-yy hh24:mi:ss'));
                  

                  【讨论】:

                    【解决方案16】:
                    SELECT * FROM test where DATEPART(year,[TIMESTAMP]) = '2018'  and  DATEPART(day,[TIMESTAMP]) = '16' and  DATEPART(month,[TIMESTAMP]) = '11'
                    

                    【讨论】:

                      【解决方案17】:

                      使用这个

                      select * from TableName where DateTimeField > date() and  DateTimeField < date() + 1
                      

                      【讨论】:

                        【解决方案18】:

                        使用截断(列)。

                        select * from test t where trunc(t.date) = TO_DATE('2018/06/08', 'YYYY/MM/DD')
                        

                        【讨论】:

                          猜你喜欢
                          • 1970-01-01
                          • 1970-01-01
                          • 2019-08-18
                          • 1970-01-01
                          • 1970-01-01
                          • 2011-02-07
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          相关资源
                          最近更新 更多