【问题标题】:Sql query for selecting entries with today's date用于选择具有今天日期的条目的 Sql 查询
【发布时间】:2013-07-30 12:14:47
【问题描述】:

我在 sql server 2008 中有下表(称为“act_events”):

您注意到一些日期时间的格式是:“yyyy-mm-dd”和一些:“yyyy-dd-mm”,出于某种奇怪的原因,我还没有想到..

我有一个查询如下:

SELECT * from act_events
WHERE '2013-07-30'>=(CAST(e_start as DATE)) AND 
      '2013-07-30'<=(CAST(e_end as DATE))

我只想选择今天日期的事件。

但我想不出一种方法来选择这两种格式..

我尝试这个查询:

SELECT * from act_events 
WHERE( @date1>=(CAST(e_start as DATE)) AND
        @date2<=(CAST(e_end as DATE)) ) OR
      ( @date3>=(CAST(e_start as DATE)) AND
        @date4<=(CAST(e_end as DATE)) )

但它只适用于某些日期..

非常感谢您的回答。

另外,如果有一个声明会将所有日期时间更改为正确的格式,我很乐意听到。

【问题讨论】:

  • 对我来说,最有可能是 SQL 服务器,所有日期似乎都格式化为 yyyy-mm-dd?
  • @Recipe 我是这么想的,但是你在 2013-07-16 之后有 2013-01-08。我认为 OP 在区分英国和美国日期格式时存在问题。
  • 是的,从样本来看,似乎没有任何理由相信格式是混合的。但如果他们是我建议进行数据清理练习,而不是做你所说的。只是一个建议。
  • @Recipe 默认情况下。不过你可以改变它。
  • @Dvirski 那么系统中有错误的日期。 SQL 不会以某种格式存储日期 - 它只是存储表示该日期的数据。上面查询结果中的 2013-03-08 是 3 月 8 日,而不是 8 月 3 日。我怀疑添加这些日期的任何内容都是将其格式化为字符串而不是日期时间。

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


【解决方案1】:

假设日期确实是 DateTime 类型,在这种情况下您可以使用 dateadd 和 datediff。

运行这两个语句:

-- Todays date, date part only
select dateadd(dd, 0, datediff(dd, 0, getdate()))
-- Tomorrows date, date part only
select dateadd(dd, 0, datediff(dd, 0, dateadd(dd, 1, getdate())))

使用这两个,你可以做到这一点(包括编辑,感谢@gvee)

select *
from act_events 
where 
        e_start >= dateadd(dd, 0, datediff(dd, 0, getdate())) 
    and 
        e_end < dateadd(dd, 0, datediff(dd, 0, getdate()) + 1)

我应该提到getdate() 是 SQL Server 中的内置函数。例如,如果您在存储过程中使用它,当然可以将其更改为变量。

附带说明,SQL Server 中的日期实际上是一个数字。当你看到它时出现的格式是人类的,人类是不可信的,对吧?

【讨论】:

  • 您应该使用WHERE e_start &gt;= &lt;lower_date&gt; AND e_start &lt; &lt;upper_date。否则第二天的午夜将被包含在结果中。
  • 此外,您可以将最后一部分简化为DateAdd(dd, DateDiff(dd, 0, GetDate()) + 1, 0)
【解决方案2】:
select *

from t 
where 
   CONVERT(nvarchar(30), GETDATE(), 112)=substring(date_c,1,4)
       +substring(date_c,6,2)
       +substring(date_c,9,2)
   or
   CONVERT(nvarchar(30), GETDATE(), 112)=substring(date_c,1,4)
       +substring(date_c,9,2)
       +substring(date_c,6,2)

SQLFiddle demo

【讨论】:

  • 想要的日期在哪里?具体怎么样?
  • @Dvirski CONVERT(nvarchar(30), GETDATE(), 112) 将日期转换为 YYYYMMDD 格式,所以今天我们得到 20130730 现在我们必须从表中的给定 varchar 日期组成这个字符串 substring(date_c,1,4)+substring(date_c,6,2)+substring(date_c,9,2)substring(date_c,1,4)+substring(date_c,9,2)+substring(date_c,6,2) 用于不同的日期显示 'YYYY-MM-DD' 和 'YYYY-DD-MM'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
  • 2012-09-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多