• SQL like对时间查询的处理方法


    SQL数据表中有savetime(smalldatetime类型)字段,表中有两条记录,savetime值为:2005-3-8 12:12:00和2005-6-6 14:02:02
    我用下面语句什么也搜不出来
    select * from soft where soft.savetime like'%2005-3-8%'
    SQL帮助中说:
    "当搜索 datetime 值时,推荐使用 LIKE,因为 datetime 项可能包含各种日期部分。例如,如果将值 19981231 9:20 插入到名为 arrival_time 的列中,则子句 WHERE arrival_time = 9:20 将无法找到 9:20 字符串的精确匹配,因为 SQL Server 将其转换为 1900 年 1 月 1 日上午 9:20。然而,子句 WHERE arrival_time LIKE '%9:20%' 将找到匹配。"
    后运行下面语句SELECT soft.*, CAST(soft.savetime AS varchar(20)) AS strdatetime,
    发现
    SQL把smalldatetime格试转成:
    03 8 2005 12:12PM
    我何用 like'%2005-3-8%'搜索到2005年3月8日所有的记录?

    select *
    from soft
    where datediff(d,soft.savetime,convert(datetime,'20050308',121))=0
    ----
    select *
    from soft
    where convert(char(10),soft.savetime,121)='20050308'

    2, SQL对like 操作中的特殊字符处理方法:

    SQL Server查询过程中,单引号 ' 是特殊字符,所以在查询的时候要转换成双单引号 '' 。

    在like操作还有以下特殊字符:下划线_,百分号%,方括号[],尖号^。

    其用途如下:

    下划线:用于代替一个任意字符(相当于正则表达式中的 ? )

    百分号:用于代替任意数目的任意字符(相当于正则表达式中的 * )

    方括号:用于转义(事实上只有左方括号用于转义,右方括号使用最近优先原则匹配最近的左方括号)

    尖号:用于排除一些字符进行匹配(这个与正则表达式中的一样)

    以下是一些匹配的举例,需要说明的是,只有like操作才有这些特殊字符,=操作是没有的。

    a_b... a[_]b%

    a%b... a[%]b%

    a[b... a[[]b%

    a]b... a]b%

    a[]b... a[[]]b%

    a[^]b... a[[][^]]b%

    a[^^]b... a[[][^][^]]b%

    在实际进行处理的时候,对于=操作,我们一般只需要如此替换:

    ' -> ''

    对于like操作,需要进行以下替换(注意顺序也很重要)

    [ -> [[] (这个必须是第一个替换的!!)

    % -> [%] (这里%是指希望匹配的字符本身包括的%而不是专门用于匹配的通配符)

    _ -> [_]

    ^ -> [^]

    3,SQL Like 通配符特殊用法:Escape

    阐述Escape 的作用:

    1.使用 ESCAPE 关键字定义转义符。在模式中,当转义符置于通配符之前时,该通配符就解释为普通字符。例如,要搜索在任意位置包含字符串 5% 的字符串,请使用:
    WHERE ColumnA LIKE '%5/%%' ESCAPE '/'
    但是在mysql中好像不能使用"\"。
    2.ESCAPE 'escape_character'
    允许在字符串中搜索通配符而不是将其作为通配符使用。escape_character 是放在通配符前表示此特殊用途的字符。
    SELECT *
    FROM finances
    WHERE description LIKE 'gs_' ESCAPE 'S'
    GO
    意思就是:
    比如,我们要搜索一个字符串 "g_" ,如果直接 like "g_",那么 "_"的作用就是通配符,而不是字符,结果,我们会查到比如 "ga","gb","gc",而不是我们需要的 "g_".
    用 LIKE 'gs_' ESCAPE 'S' 's'表示特殊用法标志
    3.create table a (name varchar(10))
    go
    insert into a select '11%22'
    union all select '11%33'
    union all select '12%33'
    go
    select * from a WHERE name LIKE '%/%33' ESCAPE '/' --指定用'/'符号来说明跟在其后面的通配符字符为普能字符。(第二个%是字符不是通配符来的)
    go
    drop table a

    结果为:
    name
    ----------
    11%33
    12%33

    总结:

    %:匹配零个及多个任意字符; _:与任意单字符匹配; []:匹配一个范围; [^]:排除一个范围

    Symbol Meaning
    like '5[%]' 5%
    like '[_]n' _n
    like '[a-cdf]' a, b, c, d, or f
    like '[-acdf]' -, a, c, d, or f
    like '[[]' [
    like ']' ]
    like 'abc[_]d%' abc_d and abc_de
    like 'abc[def]' abcd, abce, and abcf
    like '[^1-9]' 0
    like '[^1-9b-z]' 0, a

    对于字符串中出现的特殊字符:'%','[','[]', '_' 可以使用 '[]' 把它们包含起来,这样在匹配模式(pattern)中,它们就被当作普通字符对待了。

    1. 用 like '[[]' 匹配特殊字符 '['

    select 1 where '[ABCDE' like '[[]%'
    2. 用 like ']' 匹配特殊字符 ']'

    select 1 where ']ABCDE' like ']%'
    3. 用 like '[[]]' 匹配特殊字符 '[]'

    select 1 where '[]ABCDE' like '[[]]%%'
    4. 用 like '[_]' 匹配特殊字符 '_'

    select 1 where '_ABCDE' like '[_]%'
    5. 用 like '[%]' 匹配特殊字符 '%'

    select 1 where 'ABC%DE' like 'ABC[%]DE'
    对于其他的特殊字符:'^', '-', ']' 因为它们本身在包含在 '[]' 中使用,所以需要用另外的方式来转义,于是就引入了 like 中的 escape 子句,另外值得注意的是:escape 可以转义所有的特殊字符。

    select 1 where '^ABCDE' like '!^ABCDE' escape '!'
    select 1 where '-ABCDE' like '!-ABCDE' escape '!'
    select 1 where ']ABCDE' like '!]ABCDE' escape '!'

    select 1 where '%ABCDE' like '\%ABCDE' escape '\'
    select 1 where '%ABCDE' like '!%ABCDE' escape '!'
    select 1 where '%ABCDE' like '#%ABCDE' escape '#'
    select 1 where '%ABCDE' like '@%ABCDE' escape '@'

    select 1 where '[ABCDE' like '![ABCDE' escape '!'
    select 1 where ']ABCDE' like '!]ABCDE' escape '!'
    规律就是用 escape 后面紧跟着的字符来做转义字符。 escape 后面的字符相当于 C 语言字符串中的转义字符 '\'。

    最后,看一个更加复杂的匹配

    select 1 where '[^A-Z]ABCDE' like '\[\^A\-Z\]%' escape '\'

    为了您的安全,请只打开来源可靠的网址

    打开网站 取消

    来自: http://hi.baidu.com/cubeking/blog/item/dd5dc63fa54114e23c6d97e9.html



    广告来啦: 女装频道 天天疯狂购 聚划算精选频道 天天疯狂购 秒杀满立减 淘宝皇冠店铺精选 女装风向标 鞋包配饰风向标 服饰箱包 天天疯狂购 点击链接支持我的博客 点击链接支持我的博客 点击链接支持我的博客 点击链接支持我的博客 手提包旅行包手提袋旅行袋 防水 大容量 女款 热卖 3个江浙沪包邮 雾花 韩版 可爱大圆点 二层双层 家用旅行便携式化妆包 手提包 2011新款 男包 大容量 旅行包 独立鞋位 运动包 单肩 手提 健身包

  • 相关阅读:
    [Leetcode] Symmetric tree 对称二叉树
    [Leetcode] Populating next right pointer in each node ii 填充每个节点的右指针
    [Leetcode] Populating next right pointer in each node 填充每个节点的右指针
    [Leetcode] Same tree判断是否为相同树
    [Leetcode] Path Sum II路径和
    [Leetcode] Path Sum路径和
    [Leetcode] Binary tree maximum path sum求二叉树最大路径和
    [Leetcode] The minimum depth of binary tree二叉树的最小深度
    设计模式-工厂方法模式
    设计模式-简单工厂模式
  • 原文地址:https://www.cnblogs.com/suizhikuo/p/2395299.html
Copyright © 2020-2023  润新知