Ошибка преобразования DateTime в T-SQL - PullRequest
0 голосов
/ 04 апреля 2011

У меня есть два столбца Arrive_Date и Interval в таблице с именем TimeZone.Я пытаюсь добавить эти два столбца, чтобы получить третий столбец, который будет иметь как дату, так и интервал.

Моя таблица содержит данные, подобные этим:

Interval        Arrive_Date
830             2010-11-01 00:00:00.000
1100            2010-11-01 00:00:00.000
1230            2010-11-02 00:00:00.000
0               2011-01-04 00:00:00.000
30              2011-03-17 00:00:00.000

Я хочу третий столбец как

Interval        Arrive_Date                           Arrive_DateTime
830             2010-11-01 00:00:00.000               2010-11-01 08:30:00.000
1100            2010-11-01 00:00:00.000               2010-11-01 11:00:00.000
1230            2010-11-02 00:00:00.000               2010-11-02 12:30:00.000
0               2011-01-04 00:00:00.000               2011-01-04 00:00:00.000
30              2011-03-17 00:00:00.000               2011-03-17 00:30:00.000

Я использую этот запрос:

SELECT CAST(LEFT(CONVERT(VARCHAR,Arrive_DATE,101),10) + ' ' + LEFT(Interval,2) + ':' + RIGHT(Interval,2) + ':00'  AS DATETIME)
from TimeZone

Но я получаю эту ошибку:

Msg 242, Level 16, State 3, Line 1
The conversion of a varchar data type to a datetime data type resulted in an out-of-range value.

Может ли кто-нибудь помочь мне в этом?

Ответы [ 4 ]

2 голосов
/ 04 апреля 2011

Хорошо, я не на компьютере с ядром базы данных, поэтому я не могу это проверить (и я согласен, что это ужасные строковые операции), но вот один из подходов:

SELECT  Interval, Arrive_Date,
        CAST(CONVERT(VARCHAR(8),Arrive_Date,112) + ' ' + LEFT(RIGHT('0000'+CAST(Interval AS VARCHAR(4)),4),2)+':'+RIGHT('00'+CAST(Interval AS VARCHAR(4)),2)+':00' AS DATETIME) AS Arrive_Datetime
FROM TimeZone
1 голос
/ 04 апреля 2011

Я бы использовал dateadd() и математические операнды, чтобы выполнить работу. Это должно быть быстрее.

select dateadd(minute, 
               Interval%100, 
               dateadd(hour, 
                       CAST(Interval/100 as int), 
                       Arrive_Date)
              )
from TimeZone
0 голосов
/ 04 апреля 2011

Я бы использовал вычисляемый столбец (и сохранял бы «интервал» как желаемое смещение в секундах от начала дня (но это только я):

drop table #TimeZone
go
create table #TimeZone
(
  id            int      not null identity(1,1) primary key ,
  interval_hhmm int      not null ,
  Arrive_Date   datetime not null ,
  Arrive_DateTime as dateadd(   mm , interval_hhmm % 100 , -- add the minutes
                       dateadd( hh , interval_hhmm / 100 , -- add the hours
                         convert(datetime,convert(varchar,Arrive_Date,112),112) -- make sure the base date/time value doesn't have a time component
                       )
                     ) ,
)
go

insert #TimeZone ( interval_hhmm , Arrive_Date ) values(830  , '2010-11-01 23:59:59.000')
insert #TimeZone ( interval_hhmm , Arrive_Date ) values(1100 , '2010-11-01 00:00:00.000')
insert #TimeZone ( interval_hhmm , Arrive_Date ) values(1230 , '2010-11-02 00:00:00.000')
insert #TimeZone ( interval_hhmm , Arrive_Date ) values(0    , '2011-01-04 00:00:00.000')
insert #TimeZone ( interval_hhmm , Arrive_Date ) values(30   , '2011-03-17 00:00:00.000')

select * from #timezone
0 голосов
/ 04 апреля 2011

Как насчет использования DATEADD () вместо этих уродливых строковых операций?

Попробуйте что-то вроде:

SELECT
    Interval % 100 AS [Minutes],
    CONVERT(INT, Interval / 100) AS [Hours],
    DATEADD(HOUR, CONVERT(INT, Interval / 100), DATEADD(MINUTE, Interval % 100, Arrive_Date)) AS [AllTogether]
FROM TimeZone
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...