【问题标题】:Query to select data between two dates with the format m/d/yyyy查询以选择格式为 m/d/yyyy 的两个日期之间的数据
【发布时间】:2013-01-18 20:41:04
【问题描述】:

当我尝试从两个日期之间的表中选择记录时遇到问题。

m 使用以下查询

select * from xxx where dates between '10/10/2012' and '10/12/2012'

此查询对我有用,但是当日期格式为 2013 年 1 月 1 日时.. 它不起作用..

请尽快解决我的问题。

【问题讨论】:

  • 你的列dates的数据类型是什么?你的日期是以mm/dd/yyyy这种格式存储的吗?
  • 日期数据类型为String,日期以m/d/yyyy格式存储
  • 使用日期作为数据类型。
  • 现在不能……还有其他解决方案吗?

标签: sql database sql-server-2008


【解决方案1】:

您必须拆分日期时间,然后以您想要的格式(例如 dd/MM/yyyy)存储它。那么你可以在 between 中使用这个查询,但我反对使用这个,因为它会搜索你数据库中的每一个数据,所以我建议你可以使用 datediff。

        Dim start = txtstartdate.Text.Trim()
        Dim endday = txtenddate.Text.Trim()
        Dim arr()
        arr = Split(start, "/")
        Dim dt As New DateTime
        dt = New Date(Val(arr(2).ToString), Val(arr(1).ToString), Val(arr(0).ToString))
        Dim arry()
        arry = Split(endday, "/")
        Dim dt2 As New DateTime
        dt2 = New Date(Val(arry(2).ToString), Val(arry(1).ToString), Val(arry(0).ToString))

        qry = "SELECT * FROM [calender] WHERE datediff(day,'" & dt & "',[date])>=0 and datediff(day,'" & dt2 & "',[date])<=0 "

这里我使用的是 dd/MM/yyyy 格式。

【讨论】:

  • 为什么在答案被接受近 12 个月后却用不合适的解决方案来回答已经回答的问题?
  • 对于特定问题有很多选择,我已经回答了,因为我认为我应该分享我如何格式化日期和在两个日期之间搜索
【解决方案2】:
SELECT * FROM tablename WHERE STR_TO_DATE(columnname, '%d/%m/%Y')
  BETWEEN STR_TO_DATE('29/05/2017', '%d/%m/%Y')
    AND STR_TO_DATE('30/05/2017', '%d/%m/%Y')

效果很好:)

【讨论】:

    【解决方案3】:
    select * from xxx where dates between '2012-10-10' and '2012-10-12'
    

    在我的观点中,我总是使用YYYY-MM-DD,从来没有遇到过任何问题。另外,它是可读且明确的。
    您应该知道,使用 BETWEEN 可能不会返回您对 DATETIME 字段的期望值,因为它会消除例如日期为 '2012-10-12 08:00' 的记录。
    我宁愿使用where dates &gt;= '2012-10-10' and dates &lt; '2012-10-13'(低于第二天)

    【讨论】:

      【解决方案4】:

      此解决方案为您的谓词条件提供 CONVERT_IMPLICIT 操作

      SELECT * 
      FROM xxx 
      WHERE CAST(dates AS date) BETWEEN '1/1/2013' and '1/2/2013'
      

      SELECT * 
      FROM xxx 
      WHERE CONVERT(date, dates, 101) BETWEEN '1/1/2013' and '1/2/2013'
      

      SQLFiddle上的演示

      【讨论】:

      • 如果是旧数据并且当前默认日期格式与m/d/yyyy不同怎么办? CONVERT 带有明确的格式说明符(在这种情况下可能是 101)会更安全。
      • tnx @Andriy M 会更安全
      • 嘿..你的回答解决了我的问题..但是当我对另一个表使用相同的查询时,它会显示错误..“从字符串转换日期和/或时间时转换失败。”查询是“SELECT * FROM transaction_tbl WHERE CAST(transaction_tbl.Date AS date) BETWEEN '1/1/2013' and '1/4/2013'”请解决这个问题...
      • 在我的回答中尝试第二个查询。
      • 此语法将阻止使用可用索引。我不会使用它,特别是对于大型数据集。
      【解决方案5】:
      $Date3 = date('y-m-d');
      $Date2 = date('y-m-d', strtotime("-7 days"));
      
      SELECT * FROM disaster WHERE date BETWEEN '".$Date2."' AND  '".$Date3."'
      

      【讨论】:

      • 如果您可以添加解释来描述代码的作用,您的答案会更清楚。
      【解决方案6】:
      DateTime dt1 = this.dateTimePicker1.Value.Date;
      DateTime dt2 = this.dateTimePicker2.Value.Date.AddMinutes(1440);
      String query = "SELECT * FROM student WHERE sdate BETWEEN '" + dt1 + "' AND '" + dt2 + "'";
      

      【讨论】:

      • 您可以尝试解释您的解决方案为何有效。比把代码放在那里要好。
      • 不,这不会工作。 OP 的问题是 dates 的类型是 string,并且是不可搜索的格式(对于他感兴趣的范围)。他在获取起始值时没有问题,这是与存储数据的比较。此外,没有理由在此处使用参数化查询 - 尽管我们甚至不知道他的实际应用层语言是什么。
      【解决方案7】:

      试试这个:

      select * from xxx where dates between convert(datetime,'10/10/2012',103) and convert(dattime,'10/12/2012',103)
      

      【讨论】:

      • 不,这不会工作。 OP 的问题是 dates 的类型是 string,并且是不可搜索的格式(对于他感兴趣的范围)。他在获取起始值时没有问题,这是与存储数据的比较。
      【解决方案8】:

      试试这个

      SELECT * 
      FROM xxx 
      WHERE dates BETWEEN STR_TO_DATE('10/10/2012', '%m/%d/%Y') 
        AND STR_TO_DATE('10/12/2012', '%m/%d/%Y')  ;
      

      SELECT * 
      FROM xxx 
      WHERE STR_TO_DATE(dates , '%m/%d/%Y') BETWEEN STR_TO_DATE('10/10/2012', '%m/%d/%Y') 
        AND STR_TO_DATE('10/12/2012', '%m/%d/%Y')  ;
      

      【讨论】:

      • 谢谢.. 但我使用的是 sql server 2008
      • 嗯,你应该告诉数据库。顺便说一句,问题问题得到了正确解决;
      【解决方案9】:

      默认情况下,Mysql 以“YYYY/MM/DD”格式存储和返回“日期”数据类型值。 因此,如果我们想以不同的格式显示日期,那么我们必须根据脚本语言的要求来格式化日期值

      顺便说一下,列数据类型是什么以及您存储值的格式。

      【讨论】:

      • 日期数据类型为String,日期以m/d/yyyy格式存储
      【解决方案10】:

      使用这个

      select * from xxx where dates between '10/oct/2012' and '10/dec/2012'
      

      你正在输入字符串,所以请按照格式给出月份的名称...

      【讨论】:

      • 不,这不会工作。 OP 的问题是 dates 的类型是 string,并且是不可搜索的格式(对于他感兴趣的范围)。他在获取起始值时没有问题,这是与存储数据的比较。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-09
      • 2015-07-01
      • 2011-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多