【问题标题】:Dividing a date value in T-SQL在 T-SQL 中除以日期值
【发布时间】:2019-06-14 20:13:44
【问题描述】:

我正在将 Access 程序迁移到 SQL Server。 以下是我直接取自access的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.

这两个字段都是日期时间类型。有什么想法我想念的吗?

【问题讨论】:

  • 错误信息很清楚:将日期值转换为Double/Float,然后进行算术运算。
  • 您缺少的是,这是句法废话,您还有更多工作要做 - 并且在此之前可能还有额外的学习要做。您将需要弄清楚该计算的结果应该是什么,然后将其转换为 tsql。我可以猜测您应该使用 datediff 来获取日期之间的天数(?)然后除以,但我不知道它的真正作用。
  • 将算术直接应用于日期实际上没有什么意义。日期不是数字,它们是(不出所料)日期。如果我要问你今天 (20190121) / 7 是什么日子,你能回答吗? (日期)20170804 * 2 呢?在不知道您在这里真正想要实现的目标的情况下,答案很困难。我怀疑其他人是对的,您想要天数/100 的差异,因此您需要使用DATEDIFF,但是,我们还需要知道一些示例数据和预期结果。
  • 如果你也有时间值,这非常重要,因为像 DATEDIFF(DAY,'2019-01-20T00:00:00', '2019-01-21T23:59:59') 这样的东西是 1,尽管基本上相隔 2 天,而 DATEDIFF(DAY,'2019-01-21T23:59:59','2019-01-22T00:00:01') 是 1,尽管只有两个日期和时间之间相隔 2 秒。
  • @level3looper - 它可能是一些更大计算的一部分,例如简单的每日利息支付 - 例如,如果它是每天 1% 的利息

标签: sql-server tsql ms-access database-migration


【解决方案1】:
Declare @pd Date = '2019-01-15'
Declare @dr Date = '2019-01-12'

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

结果

0.03

更新:根据 Cato 的评论,允许 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

【讨论】:

  • 如果他的访问日期时间总是包含整个日期,但如果它们包含时间组件,例如 2001-01-01 19:00:00 到 2001-01-05 13:00:00 则无效例如
【解决方案2】:

由于访问日期被有效地存储为 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

访问应将日期视为浮点数,小数部分表示时间,整数部分表示天

【讨论】:

  • 这个最准确。
【解决方案3】:

我想如果我是对的,你正在寻找这样的东西

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

如果正确,您可以获取更多详细信息here

【讨论】:

  • 其实我觉得你应该把两个日期参数颠倒过来
  • @GeorgeMenoutis 可能是
  • 这完成了工作。我最初正在考虑这样做,但我认为除以 100 时会遇到同样的问题。谢谢@SurajKumar
  • 由于 DateDiff 计算边界交叉点(如我对问题的评论中所述),该值可能与 Access 中返回的值有些不同。此处的 TSQL 代码将返回整数除法的结果,与 Access 表达式不同,除非更改了常量(100.0)或添加了cast(或convert)。
猜你喜欢
  • 1970-01-01
  • 2018-11-03
  • 1970-01-01
  • 2021-06-13
  • 2021-09-11
  • 2021-03-19
  • 2017-07-12
  • 2015-05-19
  • 1970-01-01
相关资源
最近更新 更多