【问题标题】:Calculating datetime in SQL server with older dates from VBA Access使用 VBA Access 中的较旧日期计算 SQL Server 中的日期时间
【发布时间】:2015-08-13 14:31:00
【问题描述】:

我有一个问题,我无法解决。

我在 MS Access 的宏中进行了时间计算。例如

format(datediff("n",Format(#2015-08-12 17:30:00#, "dd.mm.yyyy hh:nn"),Format(#2015-08-12 23:00:00#, "dd.mm.yyyy hh:nn"))/1440,"hh:nn")

给出5:30,它存储在 SQL SErver 2008R2 的日期时间列中 1899-12-30 05:30:00.000.

现在我将计算转移到存储过程中并使用

convert(time,'2015-08-12 23:00:00'-'2015-08-12 17:30:00')

我得到1900-01-01 05:30:00.000 的日期时间值。

我知道这是 VBA 和 SQL Server 之间的区别,但我该如何解决它,甚至更好地处理已经存在的值?

【问题讨论】:

  • 您要计算什么?一次?还是日期和时间?您的两个示例中的时间 (5:30) 都是正确的。
  • 我只需要几小时和几分钟的工作时间。这个时间乘以小时工资就是工资。
  • 答案在两种情况下都是正确的,除非您出于好奇想知道为什么不同的日期,否则我看不到任何问题。
  • 我只需要几小时和几分钟的工作时间。这个时间乘以小时工资就得到了薪水。问题是,当第一次将日期从 Access-Database 传输到 SQL-Server 时,我将列定义为 datetime 并且仍然填充了 VBA 中的值。现在我尝试将数据类型更改为 time(7),当计算 convert(float, workingtime)*wages*1440/60 作为薪水时,我得到一个错误“不允许从数据类型 time 到 float 的显式转换。”那么我该如何处理这个问题呢?

标签: sql sql-server datetime


【解决方案1】:

当我这样做时:

  SELECT CONVERT(time, '2015-08-12 17:30:00')

我明白了:

17:30:00.0000000

这是一个 TIME 数据类型值,可用于计算,我知道您正在寻找它。如果我误解了,那么你的问题对我来说还不够清楚。

编辑:

至于你评论中的这个问题:

现在我尝试将数据类型更改为 time(7) 并在计算时 转换(浮动,工作时间)*工资* 1440/60 作为薪水我得到一个错误 '不允许从数据类型 time 到 float 的显式转换。'所以 我该如何处理这个问题?

为此,您应该获取以分钟为单位的日期差异,然后除以 60,而不是计算 TIME 数据类型:

CAST(DATEDIFF(minute,'2015-08-12 17:30:00','2015-08-12 23:00:00') AS float)/60.00)*wages*1440/60 as salary

【讨论】:

    猜你喜欢
    • 2016-09-19
    • 1970-01-01
    • 2015-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-29
    • 1970-01-01
    相关资源
    最近更新 更多