在其中一张表中,日期列值如下所示
date
25052008112228
26052008062717
表名是事务
我尝试使用下面的查询,但它的抛出错误
select * from transaction where date between '2012-01-06' and '2012-06-30'
select * from transaction where date between '2012/01/06' and '2012/06/30'
给我一个解决方案。
在其中一张表中,日期列值如下所示
date
25052008112228
26052008062717
表名是事务
我尝试使用下面的查询,但它的抛出错误
select * from transaction where date between '2012-01-06' and '2012-06-30'
select * from transaction where date between '2012/01/06' and '2012/06/30'
给我一个解决方案。
问题是 [date] 列不包含将自动转换为适当datetime
值的格式的日期 - 它甚至不包含受支持的格式值。因此,您只能使用字符串操作来切碎文本:
declare @Transactions table (TDate char(14))
insert into @Transactions (TDate) values
('25052008112228'),
('26052008062717')
select CONVERT(datetime,
SUBSTRING(TDate,5,4) + '-' +
SUBSTRING(TDate,3,2) + '-' +
SUBSTRING(TDate,1,2) + 'T' +
SUBSTRING(TDate,9,2) + ':' +
SUBSTRING(TDate,11,2) + ':' +
SUBSTRING(TDate,13,2))
from
@Transactions
结果:
2008-05-25 11:22:28.000
2008-05-26 06:27:17.000
CONVERT/SUBSTRING
如果您需要经常执行这种转换,您可以将这些操作包装到 UDF 中。当然,理想的做法是更改列定义以存储真正的datetime
值——当人们将它们视为文本时,几乎所有datetime
问题都会出现。
(注意,我已经重命名了表和列,因为使用保留字通常是个坏主意)
您的查询可能类似于:
;with converted as (
select *,CONVERT(datetime,
SUBSTRING([Date],5,4) + '-' +
SUBSTRING([Date],3,2) + '-' +
SUBSTRING([Date],1,2) + 'T' +
SUBSTRING([Date],9,2) + ':' +
SUBSTRING([Date],11,2) + ':' +
SUBSTRING([Date],13,2)) as GenuineDate
from [Transaction]
)
select * from converted where GenuineDate between '20120106' and '20120630'
(请注意,我还将最终查询中的日期文字也更改为安全格式)
-- asp时间戳
select * from [transaction] where
cast(SUBSTRING([date],5,4) + '-' + SUBSTRING([date],3,2) + '-' +
SUBSTRING([date],1,2) + ' ' + SUBSTRING([date],9,2) +
':' + SUBSTRING([date],11,2) + ':' +
SUBSTRING([date],13,2) as datetime)
between '2008-05-26' and '2012-01-06'
--unix 纪元时间
select * from [transaction] where [date]
between DATEDIFF( SECOND, '01-01-1970 00:00:00', '2012-01-06' )
and DATEDIFF( SECOND, '01-01-1970 00:00:00', '2012-06-30')