Разделение значения даты в T-SQL - PullRequest
0 голосов
/ 21 января 2019

Я работаю над переносом программы Access в SQL Server.Ниже приведен мой код SQL, полученный непосредственно из доступа.

(([Promise Date])-([Date Recieved]))/100

Как видите, я пытаюсь выполнить деление на значение даты и времени.

Это сообщение об ошибке, которое я получаю:

Msg 257, Level 16, State 3, Line 1
Implicit conversion from data type datetime to int is not allowed. Use the 
CONVERT function to run this query.

Оба поля имеют тип Datetime.Есть идеи, что мне не хватает?

Ответы [ 3 ]

0 голосов
/ 21 января 2019

, поскольку даты доступа эффективно хранятся как DOUBLE, я бы порекомендовал преобразовать их в тип с плавающей запятой SQL для обработки любых неполных дней

 (cast([Promise Date] as float) - cast([Date Recieved] as float))/100

посмотрите на следующий пример, различные идеи здесь дают совершенно разные ответы

declare @x as datetime = '19960420 15:05:48';
declare @y as datetime = '19960423 18:09:23';

select (CAST(@y as float) -  CAST(@x as float)) / 100

select (CAST(@y as int) -  CAST(@x as int)) / 100

select datediff(day,@x,@y) / 100

select cast(datediff(day,@x,@y) as float) / 100

Access должен обрабатывать даты как числа с плавающей запятой, дробная часть представляет время, а целочисленная часть представляет дни

0 голосов
/ 21 января 2019
Declare @pd Date = '2019-01-15'
Declare @dr Date = '2019-01-12'

Select Cast(DATEDIFF(d,@dr,@pd) As Float) /100 

Результат

0.03

ОБНОВЛЕНИЕ: Согласно комментарию Катона, чтобы разрешить DateTime

Declare @pd DateTime = '2001-01-01 19:00:00'
Declare @dr DateTime = '2001-01-05 13:00:00'

Select (Cast(DATEDIFF(hh,@dr,@pd) As Float)/24) / 100

Результат:

-0.0375
0 голосов
/ 21 января 2019

Я думаю, если я прав, вы ищете что-то вроде этого

SELECT DATEDIFF(day, [Promise Date], [Date Recieved])/100;

Если верно, вы можете получить более подробную информацию здесь

...