注册 登录
编程论坛 SQL Server论坛

SQL日期比较

wube 发布于 2017-07-04 18:23, 2471 次点击
看前人设计的数据库里栏位属性设置为datetime~
若将PK以此属性定义~而后在读取数据库资料时要以时间先后排序时~
又会发生资料无法排序先后的问题~

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

1.请教是否这datetime无法做大小比较排序?
2.后来想到说干脆改用unixtime来代替~但是一想到要转来转去就很烦~
  转换和时间差...等这部分网上有找到C#的代码~但是VB的就残念了~
3.除了拿别的方法(依序自动生成唯一识别码数字)当PK外~真的没人拿datetime当PK的吗?
9 回复
#2
mywisdom882017-07-05 12:47
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
只有本站会员才能查看附件,请 登录
#3
mywisdom882017-07-05 13:08
-- 下面用时间+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
只有本站会员才能查看附件,请 登录

#4
mywisdom882017-07-05 13:13
在SQL2000中测试,连续插入10W条记录,F3字段,都不会出现重复。有能到排序,索引的目的
#5
wube2017-07-05 13:29
因为已经到达毫秒阶段了~要出现重复机率实在很低~
当然测试时用程序跑循环~可能因为速度太快而出现重复~
但是在线上实际应用上~很难有这种状况发生~

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

unixtime最小单位是秒~风险就又更高~数字做大小比较总是比文字来得简单~
#6
mywisdom882017-07-05 13:30
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
#7
mywisdom882017-07-05 13:34
把时间 getdate()转为字符,newid()转为字符,取前8位,最后供32位的字符,是可以排序的
如果只用 newid()全球唯一序号,排序是乱的,但在前面加上时间,就是有序的,
#8
mywisdom882017-07-05 13:36
以下是引用wube在2017-7-5 13:29:08的发言:

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

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

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

因为是主键,不能有重复的,哪怕是机会很低,也不容许。
#9
wube2017-07-05 13:38
这我得拿到上试试~
我现在是用自动生成的序号去排先后~
只是想未来又遇到这状况时要怎么解决~

只有本站会员才能查看附件,请 登录

#10
wube2017-07-05 13:39
以下是引用mywisdom88在2017-7-5 13:36:08的发言:

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

不然就用双主键啰~
1