0

在其中一张表中,日期列值如下所示

 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'

给我一个解决方案。

4

2 回答 2

0

问题是 [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'

(请注意,我还将最终查询中的日期文字也更改为安全格式)

于 2012-07-12T10:30:36.793 回答
0

-- 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')
于 2012-07-12T10:09:47.217 回答