【问题标题】:query to search dates which are stored as string in the database查询以字符串形式存储在数据库中的日期
【发布时间】:2014-03-17 12:43:57
【问题描述】:

我有一个表格,我将活动完成日期存储为varchar。存储日期的格式为MM/DD/YYYY HH:MM:SS。 我有搜索窗口,其中有两个字段Completion date fromcompletion date to。此处选择的日期格式为MM/DD/YYYY

如何编写查询,以便能够从日期存储为 varchar 的表中获取两个给定日期之间的活动完成情况。该表是很久以前创建的,没有考虑保存日期作为日期时间。

【问题讨论】:

  • 我会努力修复架构。任何查询在 SQL 和性能方面都可能很糟糕,每个人都会从更好的架构中受益。
  • 我相信它肯定会有所帮助。修复架构是这里最后的选择之一。
  • 不仅“会有所帮助”,而且“将来会有所帮助”。
  • 如果我将日期存储为以下格式 MM/DD/YYYY HH:MM:SS Z 例如26/03/2014 04:48:27 BRT(巴西利亚时间),10/09/2014 05:51:32 BRST(巴西利亚夏令时间)我如何将其转换为日期时间?
  • 你会问一个新问题,提供更多细节......

标签: sql sql-server date datetime


【解决方案1】:

您可以使用 SQL CONVERT 将列更改为 DATE 格式,但这会导致性能问题。

SELECT *
    FROM MyTable
    WHERE CONVERT(DATETIME, MyDate) >= CONVERT(DATE, '01/01/2014')
        AND CONVERT(DATETIME, MyDate) <= CONVERT(DATE, '01/31/2014') 

CONVERT 文档 - http://msdn.microsoft.com/en-us/library/ms187928.aspx

如果您无法更改数据的存储方式,为了获得更好的性能,您可以使用将VARCHAR 转换为DATETIME 的计算列创建视图。之后可以在计算列上创建索引。 Index on Computed Column documentation

【讨论】:

    【解决方案2】:

    使用 SUBSTRING 函数以可比较的顺序(即 yyyymmdd)获取日期部分:

    select *
    from mytable 
    where 
      CONCAT( SUBSTRING(thedate, 7, 4) , SUBSTRING(thedate, 4, 2) , SUBSTRING(thedate, 1, 2) )
    between
      CONCAT( SUBSTRING(@FROMDATE, 7, 4) , SUBSTRING(@FROMDATE, 4, 2) , SUBSTRING(@FROMDATE, 1, 2) )
    and
      CONCAT( SUBSTRING(@TODATE, 7, 4) , SUBSTRING(@TODATE, 4, 2) , SUBSTRING(@TODATE, 1, 2) )
    ;
    

    【讨论】:

      【解决方案3】:

      您可以使用以下代码:

       select * from table_name
       where  CAST(col1 as date )  
      between CAST(Completion date from as date ) 
              and CAST(Completion date to as date);
      

      函数语法 CAST:

      CAST ( expression AS data_type )
      

      【讨论】:

      • STR_TO_DATE 不是sql-server 函数。
      • 哦!我的错 !我以为是mysql
      【解决方案4】:

      如果日期格式是{yyyy-MM-dd},可以使用下面,也可以根据格式调整charindex的索引值

      SELECT * 
      FROM table
      WHERE 
          CHARINDEX('-', col_value, 0) = 5 
          AND CHARINDEX('-', col_value, 6) = 8
          AND LEN(col_value) = 10
      

      上面的部分将在位置 5 处查找第一次出现的字符“-”,在位置 8 处查找第二个字符“-”,而整个日期值的长度等于 10 个字符

      不是完全证明,但会缩小搜索范围。如果您想添加 time,则只需在 where 中扩展条件以适应格式,即 {yyyy-MM-dd 00:00:00.000}

      这是一种安全的数据查询方式,不会出现任何意外的“无效转换/转换”错误。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-07-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-27
        • 1970-01-01
        • 2023-04-08
        相关资源
        最近更新 更多