【问题标题】:How to select a row where from and to date are exist in SQL DB如何选择 SQL DB 中存在 from 和 to date 的行
【发布时间】:2013-02-11 09:02:19
【问题描述】:

您好,我有一个如下所示的 SQL 表:

RESERVATIONROOM:

ID          NAME            FROMDATE                       TODATE      

5           Room1        2012-11-29 11:46:00.000           2012-11-29 12:45:00.000
6           Room1        2012-11-29 12:55:00.000           2012-11-29 14:20:00.000
7           Room1        2012-11-29 15:00:00.000           2012-11-29 16:42:00.000

我有一个开始日期和一个结束日期,我想选择这两个日期之间的所有房间。

例子:

表格日期:2012-11-29 11:50:00.000
迄今为止:2012-11-29 13:46:00.000

输出应该是这样的:

预订室:

ID          NAME            FROMDATE                       TODATE      

5           Room1        2012-11-29 11:46:00.000           2012-11-29 12:45:00.000
6           Room1        2012-11-29 12:55:00.000           2012-11-29 14:20:00.000

这是我目前所拥有的:

SELECT* 
FROM RESERVATIONROOM
WHERE FROMDATE BETWEEN CONVERT(DATETIME,'2012-11-29 11:50:00.000',101) AND CONVERT(DATETIME,'2012-11-29 13:46:00.000',101)
AND TODATE < CONVERT(DATETIME,'2012-11-29 13:46:00.000',101)
ORDER BY FROMDATE ASC

我的选择语句过滤太多,我看不到这两个日期之间的所有日期。

我错过了什么吗?

提前感谢您的帮助

【问题讨论】:

  • 这些日期列的类型是什么,Datetime?
  • BESETZT_BIS是什么,你还没显示。
  • 是的,它们是日期时间,抱歉 besezt_bis 是 TODATE。
  • 你为什么要使用 varchars 作为日期时间?使用 sql-parameters 来避免 sql-injection 和转换问题。

标签: sql sql-server-2008 datetime select


【解决方案1】:

抱歉转换评论,我认为这是日期时间到 varchar 转换。 但是从您输入的日期开始,您给出了两个日期,并且每个房间都有两个日期。实际上令人困惑的是这些从日期到日期是什么。从您的示例输出中,您应该在两个过滤器之间使用or。看here。 祝你好运。

select * from table1
where (convert(datetime, @from, 101) between fromdate and todate)
or (convert(datetime, @to, 101) between fromdate and todate)

【讨论】:

  • 我必须转换,因为我得到一个错误:convert varchar to datetime is out of range value...
  • 它适用于网站,但不适用于我的 sql 语句。我认为日期时间转换存在问题。它有时会说在将 varchar 转换为 datetime 时出现超出范围的错误
  • 你的日期格式是什么?可能是dmy。请在您的选择查询前添加set dateformat mdy
【解决方案2】:

你为什么要使用 varchars 作为日期时间?使用 sql-parameters 来避免 sql-injection 和转换问题。

假设参数已经是datetimes

您可以在两列上为两个参数使用BETWEEN

SELECT *
FROM RESERVATIONROOM
WHERE @dateFrom BETWEEN FROMDATE AND TODATE
 OR   @dateTO   BETWEEN FROMDATE AND TODATE

(我不确定在Where 子句中是否需要ANDOR,是否要包括交叉点?)

【讨论】:

  • 我认为我的日期时间转换存在问题。日期正在过滤,但不是时间。真正的参数是日期时间,但我想在我的代码中添加语句之前在 ms sql 中尝试一下。
  • 转换样式=101有问题。我还能用什么?
  • @ErayGeveci:您可以使用GetDate() 获取当前时间,使用DATADD(day,10,GetDate()) 获取示例数据的不同日期时间。
【解决方案3】:

代替

WHERE FROMDATE BETWEEN CONVERT(DATETIME,'2012-11-29 11:50:00.000',101) AND CONVERT(DATETIME,'2012-11-29 13:46:00.000',101)

使用

WHERE FROMDATE &gt; CONVERT(DATETIME,'2012-11-29 11:50:00.000',101)

【讨论】:

    猜你喜欢
    • 2013-07-23
    • 1970-01-01
    • 2021-09-07
    • 2021-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-29
    • 2021-12-02
    相关资源
    最近更新 更多