标题:SQL日期比较
只看楼主
wube
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:23
帖 子:1817
专家分:3681
注 册:2011-3-24
结帖率:98.24%
已结贴  问题点数:20 回复次数:9 
SQL日期比较
看前人设计的数据库里栏位属性设置为datetime~
若将PK以此属性定义~而后在读取数据库资料时要以时间先后排序时~
又会发生资料无法排序先后的问题~

datetime的时间格式为 : 2012-08-30 09:07:07.456
內GetDate()这个函式取得的~

1.请教是否这datetime无法做大小比较排序?
2.后来想到说干脆改用unixtime来代替~但是一想到要转来转去就很烦~
  转换和时间差...等这部分网上有找到C#的代码~但是VB的就残念了~
3.除了拿别的方法(依序自动生成唯一识别码数字)当PK外~真的没人拿datetime当PK的吗?
搜索更多相关主题的帖子: SQL 比较 datetime 时间 排序 
2017-07-04 18:23
mywisdom88
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:190
帖 子:3125
专家分:8340
注 册:2015-3-25
得分:20 
SQL的时间格式是2012-08-30 09:07:07.456
这个时间,是有重复的,不能用做主键
你可以在数据库中测试,连续插入1000条记录,其中很多时间是重复了。
if object_id('tempdb..#tb') is not null drop table #tb
create table #tb(f1 int,f2 datetime)
declare @i int
set @i=1
while @i<=1000
begin
insert into #tb select @i,getdate()
set @i=@i+1
end
select * from #tb
2017-07-05 12:47
mywisdom88
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:190
帖 子:3125
专家分:8340
注 册:2015-3-25
得分:0 
-- 下面用时间+NEWID()来做主键
if object_id('tempdb..#tb') is not null drop table #tb
go
create table #tb(f1 int,f2 datetime,f3 varchar(32) Primary Key)
declare @i int
set @i=1
while @i<=1000
begin
insert into #tb select @i,getdate(),convert(varchar(23),getdate(),121)+'-'+substring(cast(newid() as varchar(36)),1,8)
set @i=@i+1
end
select f3 from #tb group by f3 having count(f3)>1 --查看有无重复

select * from #tb order by f3

2017-07-05 13:08
mywisdom88
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:190
帖 子:3125
专家分:8340
注 册:2015-3-25
得分:0 
在SQL2000中测试,连续插入10W条记录,F3字段,都不会出现重复。有能到排序,索引的目的
2017-07-05 13:13
wube
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:23
帖 子:1817
专家分:3681
注 册:2011-3-24
得分:0 
因为已经到达毫秒阶段了~要出现重复机率实在很低~
当然测试时用程序跑循环~可能因为速度太快而出现重复~
但是在线上实际应用上~很难有这种状况发生~

当然在尾端再加入随机编码更安全~但是我的问题是~这组字符串要怎么去做大小排序~
当然我想过干脆使用unixtime来搞~只是这样一来~每次都要转来转去~实在很麻烦~

unixtime最小单位是秒~风险就又更高~数字做大小比较总是比文字来得简单~

不要選我當版主
2017-07-05 13:29
mywisdom88
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:190
帖 子:3125
专家分:8340
注 册:2015-3-25
得分:0 
convert(varchar(23),getdate(),121)+'-'+substring(cast(newid() as varchar(36)),1,8)
2017-07-05 13:09:46.727-006FB809
2017-07-05 13:09:46.727-01AC80B4
2017-07-05 13:09:46.727-0426CC51
2017-07-05 13:09:46.727-057FEA66
2017-07-05 13:09:46.727-062DB47C
2017-07-05 13:09:46.727-07706133
2017-07-05 13:09:46.727-0DE81F3E
2017-07-05 13:09:46.727-10EEFDF1
2017-07-05 13:09:46.727-161F2FDD
2017-07-05 13:09:46.727-16E28ED1
2017-07-05 13:09:46.727-1CB99602
2017-07-05 13:09:46.727-1DD381F9
2017-07-05 13:09:46.727-1DEA54A8
2017-07-05 13:09:46.727-1E8149CD
2017-07-05 13:09:46.727-1FAC252A
2017-07-05 13:09:46.727-218DFC89
2017-07-05 13:09:46.727-21D2D6BD
2017-07-05 13:09:46.727-223DA9E7
2017-07-05 13:09:46.727-2256AB0D
2017-07-05 13:09:46.727-2386E02D
2017-07-05 13:30
mywisdom88
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:190
帖 子:3125
专家分:8340
注 册:2015-3-25
得分:0 
把时间 getdate()转为字符,newid()转为字符,取前8位,最后供32位的字符,是可以排序的
如果只用 newid()全球唯一序号,排序是乱的,但在前面加上时间,就是有序的,
2017-07-05 13:34
mywisdom88
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:190
帖 子:3125
专家分:8340
注 册:2015-3-25
得分:0 
以下是引用wube在2017-7-5 13:29:08的发言:

因为已经到达毫秒阶段了~要出现重复机率实在很低~
当然测试时用程序跑循环~可能因为速度太快而出现重复~
但是在线上实际应用上~很难有这种状况发生~

当然在尾端再加入随机编码更安全~但是我的问题是~这组字符串要怎么去做大小排序~
当然我想过干脆使用unixtime来搞~只是这样一来~每次都要转来转去~实在很麻烦~

unixtime最小单位是秒~风险就又更高~数字做大小比较总是比文字来得简单~

因为是主键,不能有重复的,哪怕是机会很低,也不容许。
收到的鲜花
  • wube2017-07-05 13:38 送鲜花  10朵   附言:我很赞同
2017-07-05 13:36
wube
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:23
帖 子:1817
专家分:3681
注 册:2011-3-24
得分:0 
这我得拿到上试试~
我现在是用自动生成的序号去排先后~
只是想未来又遇到这状况时要怎么解决~



不要選我當版主
2017-07-05 13:38
wube
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:23
帖 子:1817
专家分:3681
注 册:2011-3-24
得分:0 
以下是引用mywisdom88在2017-7-5 13:36:08的发言:

 
因为是主键,不能有重复的,哪怕是机会很低,也不容许。

不然就用双主键啰~

不要選我當版主
2017-07-05 13:39



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-479164-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.200581 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved