SQL 删除问题
以下是我执行的语句:
DELETE FROM ManageData WHERE (CONVERT(varchar, shijian, 120) = '2013-04-02 09:19:43')
执行结果提示成功执行查询。可是数据却没有删除。而2013-04-02 09:19:43这个时间记录是存在在数据库里边的。
limianku 您的解答比较全面,可是现在我这个问题怎么解决呢?可以写个例子吗?SQL刚接触,关于一些函数和运算符还是不太了解呢。现在关键是通过‘2013-04-02 09:19:43’ 这个时间来查询都时灵时不灵的,有的时间记录却查到,有的查不到,而数据库的确存在的,居然都查不到,为什么呢?
是的,现在发现数据库中同一秒会产生多条数据了。请问怎么精确到毫秒来处理删除数据呢?时间是变量来的,是读取服务器数据库里边的时间来显示给客户的,然后客户想删除就通过选择一条记录来删除数据库中的记录。因为数据库里边的行有很可能几行的数据都是相同的,但是就是时间不同,像这种情况怎么处理删除记录比较好呢?我现在的想法是通过时间来确定是哪一条再删除。 展开
1、根据‘2013-04-02 09:19:43’作为条件来查询出数据iD,根据ID来删除,这样可以确保不会误删其他的数据,毕竟如果站在服务器角度,同一秒产生多条数据是很平常的事情,因此你可能会获得多个ID。
2、使用日期函数来处理时间比较,而不要直接用=来比较,如果你更喜欢用运算符的话,你要考虑如果同一秒有多条数据你如何取舍,是全部删除吗?还有毫秒数的对比,很多时候你并非DBA的情况下并无法看到数据的实际内容。
3、如果不考虑同一秒多条数据的情况,或者同一秒的数据都不要的情况下,建议将“=”改成begin and来处理时间。啰嗦一句,begin and使用中begin是包含的,不包含end所述时间。也可以用>= and <来解决
你的解答比较全面,可是现在我这个问题怎么解决呢?可以写个例子吗?SQL刚接触,关于一些函数和运算符还是不太了解呢。
现在关键是通过‘2013-04-02 09:19:43’ 这个时间来查询都时灵时不灵的,有的时间记录却查到,有的查不到,而数据库的确存在的,居然都查不到,为什么呢?
其实应该说你这个问题本来的解决思路就不科学,这样把,我手头没有mysql数据库,我用sql做个个例子你看看把,先看看我的测试数据
你可以看到,我模拟了数据库在服务器端绝对会遭遇的一秒多条数据,那么你可以看看,在统一毫秒有多达7调数据,当然我要说明,这些数据的registerTime字段不是我给予的静态值,而是通过程序动态插入的。那么在此情况下,你是否可以告诉我,你需要删除哪些数据呢?是全部11点08分05秒的数据吗?正常来讲这样是不符合逻辑的,如果你一定要这样做,我可以提供一条语句实现你的要求:delete from dateTest where registerTime between '2013-04-02 11:08:05' and '2013-04-02 11:08:06'
你执行上述语句就可以删除所有2013-04-02 11:08:05秒的数据,当然针对上图的数据,那就是删除全部,因为数据全部都是这个时间产生的。
当然,针对你的问题,我觉得你应该寻求其他的删除标识维度,数据库的管理里面本来就不推荐做删除的操作,更何况是不明确的删除,这样的操作本身风险就非常大,而且完全不可逆。
上述是我对你需求的理解,如果你能更明确你的需求可以继续追问
有点没听懂你的意思
大哥。这是MS SQL。哪来的to_char函数啊。
my sql 也有好吧
shijian字段是“datetime”类型的经一说,怪事了。有的时间记录能查到,有的时间记录却查不到。郁闷。查询居然有这样的层事?并且用上边的这条记录我还成功删除过数据,而现在却又删除不了,不知道怎么回事?怪哉。查询语句是:
SELECT * FROM ManageData WHERE (CONVERT(varchar, shijian, 120) = '2013-04-02 09:19:43')怎么时灵时不灵的?
我觉得你还是要确认一下数据类型,不能用ssms展开表结构吗?
CONVERT(varchar, shijian, 120)这个转换只针对时间类型,如果你原本是varchar类型的话就无效了,还是会将毫秒输出的,你把这个转换放在select列表中,看一下转换的效果是否带毫秒