sql 如何查不正确的sql 查询日期格式转换?

博客访问: 84830
博文数量: 36
注册时间:
认证徽章:
分享技术 分享快乐
分类: Oracle 20:05:02
如果一定要是动态SQL,一定要将日期类型用||拼起来,见下列写法,红色的是错的,下面的才对,两次类型转换,但是没有什么必要
--要么用绑定变量绑定date类型,要么静态sql,不要两次转换,直接拼日期前后不加单引号还会报错。
SQL& DECLARE
& 2 & v_date date :=
& 3 & v_cnt number := 0;
& 4 & v_sql varchar2(100);
& 5 &BEGIN
& 6 & &v_sql := 'SELECT COUNT(*) FROM USER_OBJECTS WHERE CREATED&='||v_ &
& &7 & &DBMS_OUTPUT.PUT_LINE(v_sql);
& 8 & &v_sql := 'SELECT COUNT(*) FROM USER_OBJECTS WHERE CREATED&='||chr(39)||v_date||chr(39);
& 9 & & &DBMS_OUTPUT.PUT_LINE(v_sql);
10 & &EXECUTE IMMEDIATE v_sql INTO v_
11 & & & &DBMS_OUTPUT.PUT_LINE(v_cnt);
-- v_sql := 'SELECT COUNT(*) FROM USER_OBJECTS WHERE CREATED&=TO_DATE('''||v_date||''',''dd-mon-yy'')';
& -- & DBMS_OUTPUT.PUT_LINE(v_sql);
SELECT COUNT(*) FROM USER_OBJECTS WHERE CREATED&=04-1月 -11
SELECT COUNT(*) FROM USER_OBJECTS WHERE CREATED&='04-1月 -11'
PL/SQL procedure successfully completed
DROP TABLE
CREATE TABLE t(p1 DATE)
PARTITION BY RANGE(p1)
(PARTITION p0 VALUES LESS THAN &( TO_DATE ('', 'YYYYMMDD')) &TABLESPACE USERS);
1.对非DDL,应该要使用绑定变量,如果绑定变量适合的话
2.DDL,用不了绑定变量,必须to_date拼凑
& &p1 & DATE := TO_DATE ('', 'YYYYMMDD');
& EXECUTE IMMEDIATE 'alter session set nls_date_format=''yyyymmdd''';
& &FOR i IN 1 .. 2
& & & EXECUTE IMMEDIATE
& & & & & & 'alter table t add partition p'
& & & & &|| TO_CHAR (p1, 'YYYYMMDD')
& & & & &|| ' &VALUES LESS THAN ( TO_DATE('''
& & & & &|| p1
& & & & &|| ''',''yyyymmdd'')) &TABLESPACE USERS';
& & & p1 := p1 + 1;
& &END LOOP;
--不用设nls_date_format,因为两次转换的nls_date_format一样,直接to_date,因为自动转换的字符串没有引号,需要补上引号
& &p1 & DATE := TO_DATE ('', 'YYYYMMDD');
& &FOR i IN 1 .. 2
& & & EXECUTE IMMEDIATE
& & & & & & 'alter table t add partition p'
& & & & &|| TO_CHAR (p1, 'YYYYMMDD')
& & & & &|| ' &VALUES LESS THAN ( TO_DATE('''
& & & & &|| p1
& & & & &|| ''')) &TABLESPACE USERS';
& & & p1 := p1 + 1;
& &END LOOP;
--甚至可以去掉to_date,自动转为目标类型,但是要补引号
& &p1 & DATE := TO_DATE ('', 'YYYYMMDD');
& &DBMS_OUTPUT.put_line( & & 'alter table t add partition p'
& & & & &|| TO_CHAR (p1, 'YYYYMMDD')
& & & & &|| ' &VALUES LESS THAN ( '''
& & & & &|| p1
& & & & &|| ''') &TABLESPACE USERS');
也可以对p使用显示转为字符串,和上面一样
& 'alter table t add partition p'
& & & & &|| TO_CHAR (p1, 'YYYYMMDD')
& & & & &|| ' &VALUES LESS THAN ( TO_DATE('''
& & & & &|| TO_CHAR(p1,'YYYY-MM-DD')
& & & & &|| ''',''YYYY-MM-DD'')) &TABLESPACE USERS'
再看一个典型的拼凑日期的错误。
我常常看到别人不使用绑定变量,采用拼凑的方式传入日期类型,比如:
& vname varchar2(10):='dd';
& v_sql varchar2(4000);
& v_date date:=
& & v_sql:='select count(*) from test where birth='||v_ --这里要出错
& & dbms_output.put_line(v_sql);
& & execute immediate v_
& & dbms_output.put_line(vcnt);
这里又出什么错呢?请看打印出的语句是什么?
select count(*) from test where birth=08-5月 -10
原来在运行期,如果采用||date,那么日期自动根据session日期设置参数转换为字符串,而字符串连接不自动加引号,所以就变成上面的了,丢失了引号,自动转换也失效,语句错误了,如果你非要那样做,只能
1. & & & &将v_date转为字符串,带引号的,然后让其自动转换,如: &v_sql:='select count(*) from test where birth='''||v_date||''''; &当然也可以使用to_date,如
& v_sql:='select count(*) from test where birth=to_date('''||v_date||''')';
不需要nls_date_format设置,因为两次转换的格式一样.
也可以显示转换,代替oracle自动转换v_sql:='select count(*) from test where birth='''||to_char(v_date)||'''';
最完整的全部显示转换
v_sql:='select count(*) from test where birth=to_date('''||to_char(v_date,'yyyymmdd')||''',''yyyymmdd'')';
2. & & & &DDL用不了绑定变量,只能使用1的方法,对非DDL,要用绑定变量,解决这个问题,一般起到软解析效果。
& & & & 以上是典型的拼凑导致的程序难以编写而且容易出错的例子,如果采用绑定变量的方式,以上问题全可迎刃而解。
也说明了一点,绑定变量不光使我们的SQL反复执行的效率更高,在存储过程的动态SQL里,绑定变量也会使我们减少错误的发生,更容易地进行编程(存储过程的静态SQL自动绑定,达到软解析或软软解析的效果,当然动态SQL也可能软或软软解析)
不加to_date,发生2次转换
第1次,v_date是date类型,但是用||运算,变为字符串
第2次,||两边加了引号,但是birth是date类型,又把字符串转为date类型
因为这两次转换的格式和环境都一样的,所以可以自动转来转去,当然可读性不是很好
阅读(4477) | 评论(0) | 转发(0) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。导入数据库数据时出现日期格式不对。现怎么在EXCEL中将19835格式改为,数据很多只能求助大家。在线等
这样干吧:把你的那些格式不对的数复制到我给你的附件中的A列,那么B列中就会出来你想要的日期格式了。注意不要修改B列中的公式,(B列中出来错误的地方不用管,因为A列中没有相应数^-^).如果数据非常多,则在B列中按填充任意向下填充。
祝你早日解决问题。
其他答案(共6个回答)
单栏上选择“格式”→“单元格”或直接按快捷键“Ctl+1”
3、在弹出的对话框中选择“数字”选项卡(默认选择);
4、下面罗列了许多数字类型,选择“日期”类型;
5、在右边又列出了许多日期的显示格式,请选择你需要的格式后“确定”即可;
6、若该单元格所在的“字段”(列)均是该格式的话,...
要想改变日期的显示样式,需要改变"单元格格式"
具体操作是:
1、选择该单元格;
2、在菜单栏上选择“格式”→“单元格”或直接按快捷键“Ctl+1”
3、在弹出的对话框中选择“数字”选项卡(默认选择);
4、下面罗列了许多数字类型,选择“日期”类型;
5、在右边又列出了许多日期的显示格式,请选择你需要的格式后“确定”即可;
6、若该单元格所在的“字段”(列)均是该格式的话,请用“自动填充”或“格式刷”工具进行拖放操作即可。
我的回答你还满意吧,如果还有什么问题欢迎与我联系。
Oracle的不知道,没有用过
SQLSERVER的知道
作为网络的一个重要应用,数据库在网站建设与网络营销中发挥着重要的作用,与普通网站相对而言,具有数据库功能的网站网页我们通常称为动态页面,也就是说页面不是一层不变...
感谢分享!已改好,请下载使用。
这个数据类型不限於只能存图像,还可以存储其他的各种各样的文件。是没有限制的。他其实是吧文件转换为2进制的数据进行存储了。建议你在存储这类数据时,最好把当初保存的...
从他们的关系上理解:
一个Oracle数据库是由一个或多个表空间(tablespace)的逻辑存储单位构成的,这些表空间共同来存储数据库的数据
oOracle数...
答: 一般纯人工投票价格0.2元一票,如何报价还有低的,都不是人工投票,机器刷票比人工投票价格便宜,不过人工投票才是安全的。我知道一家人工投票团队收费低的—追风人工拉...
答: 新一代的计算机已将网络接口集成到主板上,网络功能已嵌入到操作系统之中,智能大楼的兴建已经和计算机网络布线同时、同地、同方案施工
答: 正常,无线都这样
大家还关注
Copyright &
Corporation, All Rights Reserved
确定举报此问题
举报原因(必选):
广告或垃圾信息
激进时政或意识形态话题
不雅词句或人身攻击
侵犯他人隐私
其它违法和不良信息
报告,这不是个问题
报告原因(必选):
这不是个问题
这个问题分类似乎错了
这个不是我熟悉的地区
相关问答:123456789101112131415t-sql中日期时间格式化查询sql语句
作者:用户
本文讲的是t-sql中日期时间格式化查询sql语句,
今天在做会员管理系统搜索时,我发现以前的搜索时间方式不太科学,效率也不是太高.由其是在查询指定的时间相等的时候,我在数据库中都存这样的时间格式& 14:32:12&当我们在查询是否与它相等,
今天在做会员管理系统搜索时,我发现以前的搜索时间方式不太科学,效率也不是太高.由其是在查询指定的时间相等的时候,我在数据库中都存这样的时间格式" 14:32:12"当我们在查询是否与它相等,结果是不相等的.
所我们都喜欢找其它途径来解决这个问题。但是我发现我们的方法都不是太好,因为我们有的时候对 sever
的语句特性还了解的不够彻底。所以我查询了查sql server有帮助,终于发现个好东西,可以解决这个问题.
CONVERT 函数,可以解决这个问题,能将 14:32:12这样的时间在查询或where 子句中格式化为:;
我将查询用户的注册时间 UserRegisterTime
select * from [user] where UserActive=0 and replace(CONVERT(char(10),UserRegisterTime,111),'/','-')='' order by UserRegisterTime desc
在这其中关键的一句
replace(CONVERT(char(10),UserRegisterTime,111),'/','-');
为什么我要replace将convert中的"/"符,换成"-"呢.是因为convert在这里格式化出来的时间是:
还要特别说明一点:convert格式化出为的时间都是带有前有0的格式,比如 12:12:31结果为:
,所以你在查询前务必要将你的日期中的月和日中小于10(不包括10)的数字加上前导0,
如:1就应该为01
此涵数的具体用法如下:
当 Microsoft(R) SQL Server(TM) 2000 不自动执行不同数据类型的表达式转换时,可使用转换函数 CAST 和 CONVERT 进行转换。这些转换函数还可用来获得各种特殊的数据格式。这两个转换函数都可用于选择、Where 子句和允许使用表达式的任何地方。
如果希望 Transact-SQL 程序代码遵从 SQL-92 标准,请使用 CAST 而不要使用 CONVERT。如果要利用 CONVERT 中的样式功能,请使用 CONVERT 而不要使用 CAST。
使用 CAST 或 CONVERT 时,需要两条信息:
要转换的表达式(例如,销售报告要求销售数据从货币型数据转换为字符型数据)。
要将所给表达式转换到的数据类型,例如,varchar 或 SQL Server 提供的任何其它数据类型。
除非将被转换的值存储起来,否则转换仅在 CAST 或 CONVERT 函数的作用期内有效。
在下面的示例中,第一个 Select 语句中使用 CAST,第二个 Select 语句中使用 CONVERT,将 title 列转换为 char(50) 列,以使结果更可读:
Select CAST(title AS char(50)), ytd_sales
FROM titles
Where type = 'trad_cook'
Select CONVERT(char(50), title), ytd_sales
FROM titles
Where type = 'trad_cook'
下面是结果集:(对任何一个查询)
----------------------------------------- -----------
Onions, Leeks, and Garlic: Cooking Secrets of the 375
Fifty Years in Buckingham Palace Kitchens 15096
Sushi, Anyone? 4095
(3 row(s) affected)
在下面的示例中,int 类型的ytd_sales 列转换为 char(20) 列,从而可以对该列使用 LIKE 谓词:
Select title, ytd_sales
FROM titles
Where CAST(ytd_sales AS char(20)) LIKE '15%'
AND type = 'trad_cook'
下面是结果集:
Title ytd_sales
----------------------------------------- ---------
Fifty Years in Buckingham Palace Kitchens 15096
(1 row(s) affected)
SQL Server 自动处理某些数据类型的转换。例如,如果比较 char 和 datetime 表达式、smallint 和 int 表达式、或不同长度的 char 表达式,SQL Server 可将它们自动转换。这种转换称为隐性转换。对这些转换不必使用 CAST 函数。但是,在下列情况下使用 CAST 都是可以接受的:
两个表达式的数据类型完全相同。
两个表达式可隐性转换。
必须显式转换数据类型。
如果试图进行不可能的转换(例如,将含有字母的 char 表达式转换为 int 类型),SQL Server 将显示一条错误信息。
如果转换时没有指定数据类型的长度,则 SQL Server 自动提供长度为 30。
转换为 datetime 或 smalldatetime 时,SQL Server 将拒绝所有无法识别为日期的值(包括 1753 年 1 月 1 日以前的日期)。当日期处于适当的范围内(1900 年 1 月 1 日到 2079 年 6 月 6 日)时,可将 datetime 值转换为 smalldatetime。时间值被四舍五入为最接近的分钟数。
转换为 bit 将把任何非零值都更改为 1。
转换为 money 或 smallmoney 时,整数后将加上货币单位。例如,整数值 4 被转换为货币时相当于 4 美元(对于默认语言 us_english)。浮点值的小数部分将四舍五入为四位小数以用于 money 值。将要转换为整数数据类型的 char 或 varchar 数据类型的表达式中,只能包含数字和可选的加号或减号(+ 或 -)。将忽略前导空格。要转换为 money 的 char 或 varchar 数据类型的表达式,还可包含可选的小数点和前导美元符号 ($)。
要转换为 float 或 real 数据类型的 char 或 varchar 类型表达式还可选择性地包含指数符号(e 或 E,后面有可选的 + 或 – 符号,再后面是数字)。
将字符表达式转换为其它大小的数据类型时,对于新的数据类型过长的值将被截断,SQL Server 将在 osql 实用工具和 SQL 查询分析器中显示星号 (*)。若数字表达式对于新的数据类型太长而无法显示,值将截断。下面是字符截断的示例:
Select SUBSTRING(title, 1, 25) AS Title, CONVERT(char(2), ytd_sales)
FROM titles
Where type = 'trad_cook'
下面是结果集:
------------------------- --
Onions, Leeks, and Garlic *
Fifty Years in Buckingham *
Sushi, Anyone? *
(3 row(s) affected)
在进行数据类型转换时,若目标数据类型的小数位数小于源数据类型的小数位数,则该值将被截断。例如,CAST(10.3496 AS money) 的结果是 $10.35。
可将 text 数据显式转换为 char 或 varchar,将 image 显式转换为 binary 或 varbinary。由于这些数据类型被限制为 8,000 个字符,所以转换也限制为 character 和 binary 数据类型的最大长度,即 8,000 个字符。可将 ntext 数据显式转换为 nchar 或 nvarchar,但最大长度为 4,000 个字符。如果没有指定长度,被转换的值的默认长度为 30 个字符。不支持隐式转换。
style 参数
将 datetime 数据转换为 char 或 varchar 数据时,CONVERT 的 style 参数提供了各种日期显示格式。为 style 参数提供的数值确定了 datetime 数据的显示方式。年份可以显示为两位或四位数。默认情况下,SQL Server 将年份显示为两位数。若要显示包括世纪的四位数年份 (yyyy)(即使年份数据是使用两位数的年份格式存储的),请给 style 值加 100 以获得四位数年份。
 Convert的使用方法:
  格式:
Convert(data_type,expression[,style])
  说明:此样式一般在时间类型(datetime,smalldatetime)与字符串类型(nchar,nvarchar,char,varchar)相互转换的时候才用到.
  例子:
Select Convert(varchar(30),getdate(),101) now
  结果为
  09/15/2001
  style数字在转换时间时的含义如下:
Style(2位表示年份)
Style(4位表示年份)
输入输出格式
mon dd yyyy hh:miAM(或PM)
hh:mm:ss
mon dd yyyy hh:mi:ss:mmmmAM(或PM)
dd mon yyyy hh:mi:ss:mmm(24小时制)
hh:mi:ss:mmm(24小时制)
yyyymmdd hh:mi:ss(24小时制)
yyyymmdd hh:mi:ss:mmm(24小时制)
以下示例显示用 style 参数进行转换:
Select CONVERT(char(12), GETDATE(), 3)
此语句把当前日期转换为样式 3,dd/mm/yy。
在这里我附上一些实例:
select CONVERT(varchar, getdate(), 120 )
select replace(replace(replace(CONVERT(varchar, getdate(), 120 ),'-',''),' ',''),':','')
select CONVERT(varchar(12) , getdate(), 111 )
select CONVERT(varchar(12) , getdate(), 112 )
select CONVERT(varchar(12) , getdate(), 102 )
select CONVERT(varchar(12) , getdate(), 101 )
09/12/2004
select CONVERT(varchar(12) , getdate(), 103 )
12/09/2004
select CONVERT(varchar(12) , getdate(), 104 )
12.09.2004
select CONVERT(varchar(12) , getdate(), 105 )
12-09-2004
select CONVERT(varchar(12) , getdate(), 106 )
12 09 2004
select CONVERT(varchar(12) , getdate(), 107 )
09 12, 2004
select CONVERT(varchar(12) , getdate(), 108 )
select CONVERT(varchar(12) , getdate(), 109 )
09 12 2004 1
select CONVERT(varchar(12) , getdate(), 110 )
09-12-2004
select CONVERT(varchar(12) , getdate(), 113 )
12 09 2004 1
select CONVERT(varchar(12) , getdate(), 114 )
11:06:08.177
以上是云栖社区小编为您精心准备的的内容,在云栖社区的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索sql
sql语句格式化日期、hql语句 格式化日期、格式化sql语句、sql语句格式化工具、sqlyog格式化sql语句,以便于您获取更多的相关知识。
弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率
40+云计算产品,6个月免费体验
稳定可靠、可弹性伸缩的在线数据库服务,全球最受欢迎的开源数据库之一
IT采购开年惠,百款产品5折起,新购满额再返最高6000!
云栖社区(yq.aliyun.com)为您免费提供相关信息,包括
,所有相关内容均不代表云栖社区的意见!SQLServer日期查询时的日期格式转换
我的图书馆
SQLServer日期查询时的日期格式转换
问题提出:经常会有这样的查询要求,输入或者日历控件产生的日期格式为 yyyy-mm-dd,而数据库中的字段是datetime类型,即yyyy-mm-dd hh:mm:ss。如果简单的使用between语句或者=语句进行查询,查询结果可能是错误或者数据不全。假设 数据库中有
日的数据,但直接使用 fielddate='' 或者使用 between '' and ''将不能查到该天的数据。
问题解决:使用SQL Server提供的Convert函数进行转换,由于最长是10位,所以使用如下语句 convert(varchar(10),fielddate,121))进行转换,其中fielddate为数据表的字段名。这样在查询时数据库得到参数后先自动将数据库内的信息转换为yyyy-mm-dd格式的10位字符,只要与参数相同即可返回查询结果.而convert中的121是指将 datetime类型转换为char类型时获得包括世纪位数的4位年份。Convert函数的一些说明,以下资料来源于网络不带世纪数位 (yy)带世纪数位 (yyyy)标准输入/输出**-0 或 100 (*) 默认值mon dd yyyy hh:miAM(或 PM)1101美国mm/dd/yyyy2102ANSIyy.mm.dd3103英国/法国dd/mm/yy4104德国dd.mm.yy5105意大利dd-mm-yy6106-dd mon yy7107-mon dd, yy8108-hh:mm:ss-9 或 109 (*) 默认值 + 毫秒mon dd yyyy hh:mi:ss:mmmAM(或 PM)10110美国mm-dd-yy11111日本yy/mm/dd12112ISOyymmdd-13 或 113 (*) 欧洲默认值 + 毫秒dd mon yyyy hh:mm:ss:mmm(24h)14114-hh:mi:ss:mmm(24h)-20 或 120 (*) ODBC 规范yyyy-mm-dd hh:mm:ss[.fff]-21 或 121 (*) ODBC 规范(带毫秒)yyyy-mm-dd hh:mm:ss[.fff]-126(***)ISO8601yyyy-mm-dd Thh:mm:ss:mmm(不含空格)-130*科威特dd mon yyyy hh:mi:ss:mmmAM-131*科威特dd/mm/yy hh:mi:ss:mmmAM
*&&& 默认值(style 0 或 100、9 或 109、13 或 113、20 或 120、21 或 121)始终返回世纪数位 (yyyy)。** 当转换为 datetime 时输入;当转换为字符数据时输出。*** 专门用于 XML。对于从 datetime 或 smalldatetime 到 character 数据的转换,输出格式如表中所示。对于从 float、money 或 smallmoney 到 character 数据的转换,输出等同于 style 2。对于从 real 到 character 数据的转换,输出等同于 style 1。使用 CONVERT:CONVERT (data_type[(length)], expression [, style])
select CONVERT(varchar, getdate(), 120 ) 11:06:08
select replace(replace(replace(CONVERT(varchar, getdate(), 120 ),\'-\',\'\'),\' \',\'\'),\':\',\'\')08
select CONVERT(varchar(12) , getdate(), 111 )
select CONVERT(varchar(12) , getdate(), 112 )
select CONVERT(varchar(12) , getdate(), 102 )
select CONVERT(varchar(12) , getdate(), 101 )09/12/2004
select CONVERT(varchar(12) , getdate(), 103 )12/09/2004
select CONVERT(varchar(12) , getdate(), 104 )12.09.2004
select CONVERT(varchar(12) , getdate(), 105 )12-09-2004
select CONVERT(varchar(12) , getdate(), 106 )12 09 2004
select CONVERT(varchar(12) , getdate(), 107 )09 12, 2004
select CONVERT(varchar(12) , getdate(), 108 )11:06:08
select CONVERT(varchar(12) , getdate(), 109 )09 12 2004 1
select CONVERT(varchar(12) , getdate(), 110 )09-12-2004
select CONVERT(varchar(12) , getdate(), 113 )12 09 2004 1
select CONVERT(varchar(12) , getdate(), 114 )11:06:08.177
TA的推荐TA的最新馆藏[转]&[转]&[转]&[转]&[转]&[转]&
喜欢该文的人也喜欢查找数据时,如何用时间类型的作为条件查找【sql吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:41,996贴子:
查找数据时,如何用时间类型的作为条件查找收藏
如题,SELECT
table1WHERE
ID&10 and time like ''后面这个time like ''不对,应该怎么写,求教
时间用between...and...就可以time between ' 00:00:00' and ' 00:00:00'
签到经验+8点,回三个贴经验+12点,整个过程不到五分钟,每天可增加经验20点。 理论上来说,你回再多帖子,经验也不会增长了~~ 单纯从捞经验考虑,这是最经济的泡吧方式了。。。我是来水经验的。。。。。
SELECT * FROM table1WHERE ID&10 and to_char(item,'yyyy-mm-dd') like ''
登录百度帐号

我要回帖

更多关于 sql 日期格式 的文章

 

随机推荐