【问题标题】:Datediff() overlapping days?Datediff() 重叠天数?
【发布时间】:2015-10-11 11:45:12
【问题描述】:

我无法弄清楚如何使用 datediff() 函数来处理重叠的日子。

这是我的桌子和黄色标记的行我有问题。

SELECT 
    FOMTID,
    TOMTID,
    DATEDIFF(MINUTE, FOMTID,TOMTID) TIME 
FROM [DATABASE]...

我确实没有有像'2001-01-01 23:30'和'2001-01-02 00:00'这样的字段,这将使日期差异功能起作用,但我只有时间。

【问题讨论】:

  • 社区有哪些类型?
  • 如果您没有日期组件,服务器如何知道您的意思是“第二天的午夜”而不是“今天的午夜”? Datediff 当第一个参数小于第二个参数时返回负值,这就是你所拥有的。如果你不喜欢这个,add 一整天到TOMTID 时拨打datediff 如果FOMTID > TOMTID
  • FOMTID = varchar(8) TOMTID = varchar(8) Time = decimal(8,2) (因为我在脚本中进一步使用了这个字段)
  • 如果我选择一行 (18),我希望它说 32 而不是 1408(或 -1408)

标签: sql-server time sql-server-2012 overlap datediff


【解决方案1】:

LiveDemo

SELECT 
  FOMTID,
  TOMTID, 
  [TIME] = IIF(FOMTID <= TOMTID,
              DATEDIFF(MINUTE, FOMTID,TOMTID),
              1440 - DATEDIFF(MINUTE, TOMTID,FOMTID))
FROM your_table;

或:

SELECT 
  FOMTID,
  TOMTID, 
  [TIME] = IIF(FOMTID <= TOMTID,
                     DATEDIFF(MINUTE, FOMTID,TOMTID),
              1440 + DATEDIFF(MINUTE, FOMTID,TOMTID))
FROM your_table;

编辑:

LiveDemo2

WITH cte AS
(
SELECT 
  FOMTID,
  TOMTID, 
  [TIME] = IIF(FOMTID <= TOMTID,
                     DATEDIFF(MINUTE, FOMTID,TOMTID),
              1440 + DATEDIFF(MINUTE, FOMTID,TOMTID))
FROM #tab
)
SELECT FOMTID, TOMTID
   ,[MINUTES] = [TIME]
   ,[TIME]  = CAST([TIME] / 60  + [TIME] % 60 / 100.0 AS DECIMAL(8,2))
   ,[TIME2] = CAST([TIME] / 60  + [TIME] % 60 / 60.0 AS DECIMAL(8,2))
FROM cte

选择您希望如何处理分钟部分:

[Time]  => 30min => 0.3
[Time2] => 30min => 0.5

【讨论】:

  • 我的代码中有这个来获取时间。你能修改你的代码来实现这个吗? CAST(CONCAT((DATEDIFF(Minute,T1.FOMTID,T1.TOMTID)/60),'.', (DATEDIFF(Minute,T1.FOMTID,T1.TOMTID)%60)) 十进制(8,2))
  • 谢谢。我试图修改我的查询并查看您的查询,但我做错了什么?选择 FOMTID, TOMTID, CASE WHEN FOMTID
  • @Nils 忘记 concat。我真的不明白你为什么不使用我的代码。
  • @Nils Here data.stackexchange.com/stackoverflow/query/374469。不需要 CTE,用 [DATABASE] 更改 #tab ...]
【解决方案2】:

如果这些是时间数据类型:

SELECT FOMTID, TOMTID,
       (CASE WHEN FOMTID <= TOMTID THEN DATEDIFF(MINUTE, FOMTID, TOMTID)
             ELSE 24*60 - DATEDIFF(MINUTE, TOMTID, FOMTID)
        END) AS TIME 

Here 是一个小小的 SQL Fiddle。

【讨论】:

    猜你喜欢
    • 2013-12-04
    • 1970-01-01
    • 2018-05-26
    • 1970-01-01
    • 2014-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-27
    相关资源
    最近更新 更多