【问题标题】:decrease/increase between date in mysql or oracle SQL在mysql或oracle SQL中减少/增加日期
【发布时间】:2015-06-29 04:38:09
【问题描述】:

我在查询 mysql 时遇到问题 我想在 2 个日期除以天之间找到每个日期的小时数 例如,


我有 startdate 14/12/2014 09:00:00AM 和 enddate 17/12/2014 03:30:00AM

我想要这样的结果

  1. 14/12/2014 - 15 小时
  2. 15/12/1014 - 24 小时
  3. 16/12/2014 - 24 小时
  4. 17/12/2014 - 3.5 小时

这在 MySQL 或 Oracle SQL 查询中是否可行?

【问题讨论】:

  • 查看 datediff 和 date_sub
  • 这不是真正的 SQL 问题

标签: mysql oracle


【解决方案1】:

终于找到了oracle sql的查询...
感谢您的帮助


SELECT
  TO_DATE (START_DATE + COLUMN_VALUE - 1, 'DD/MM/YYYY') AS THE_DATE,
  CASE
    WHEN TO_DATE (START_DATE, 'DD/MM/YYYY') = TO_DATE (END_DATE, 'DD/MM/YYYY')
      THEN (END_DATE - START_DATE)*24
    WHEN (START_DATE + COLUMN_VALUE - 1) = START_DATE
      THEN (23 - TO_CHAR (START_DATE, 'HH24')) + ((60 - TO_CHAR (START_DATE, 'MI'))/60) + ((360 - TO_CHAR (START_DATE, 'SS'))/360)
    WHEN TO_DATE (START_DATE + COLUMN_VALUE - 1, 'DD/MM/YYYY') <> TO_DATE (END_DATE, 'DD/MM/YYYY')
      THEN 24
    ELSE TO_CHAR (END_DATE, 'HH24') + 
         (TO_CHAR (END_DATE, 'MI')/60) + 
         (TO_CHAR (END_DATE, 'SS')/360) END
FROM MY_TABLE,
     TABLE( CAST( MULTISET (
       SELECT
         LEVEL L
       FROM DUAL
       CONNECT BY LEVEL <= END_DATE - START_DATE + 1) AS SYS.ODCINUMBERLIST))

【讨论】:

  • 没有。使用 EXTRACT(DAY from (first_date - second_date))。
【解决方案2】:

使用 MySQL TIMESTAMPDIFF 或 Oracle EXTRACT 函数计算两个 Datetime 类型的值字段之间的差异(第 2 和第 3 个参数)。传递的第一个参数是您选择的用于计算差异的测量值。这可能是 HOUR、MINUTE、SECOND、DAY 等。

SELECT 
  `startdate` AS `date`, 
  TIMESTAMPDIFF(
    HOUR, 
    `startdate`, 
    `enddate`) AS `hours_delta`
FROM my_table

结果是:

___date___hours_delta____

14/12/2014________66________

15/12/1014________..._________

【讨论】:

  • 那是我的错。已更正。
  • 谢谢 Zon 先生 ___________ 我正在使用 Toad for Oracle 执行这些查询_____ 但 TIMESTAMPDIFF 是无效标识符____ oracle sql 中是否有 timestampdiff 的替代品?____ _____ 这是我的查询 _____ _____ SELECT to_date( A.TGL_SLS_STT, 'dd/mm/yyyy') AS end_date, TIMESTAMPDIFF(HOUR, to_date(A.TGL_MUL_STT,'dd/mm/yyyy'), to_date(A.TGL_SLS_STT, 'dd/mm/yyyy')) AS从 STG_STT_MESIN_PMBKT_2014 A 开始的小时数
  • 使用 EXTRACT(DAY from (first_date - second_date))。详情请参阅:docs.oracle.com/cd/B19306_01/server.102/b14200/functions050.htm
【解决方案3】:

SQL Fiddle

Oracle 11g R2 架构设置

CREATE TABLE MY_TABLE ( ID, START_DATE, END_DATE ) AS
          SELECT 1, TO_DATE( '14/12/2014 09:00:00AM', 'DD/MM/YYYY HH:MI:SSAM'), TO_DATE( '17/12/2014 03:30:00AM', 'DD/MM/YYYY HH:MI:SSAM') FROM DUAL
UNION ALL SELECT 2, TO_DATE( '20/12/2014 09:00:00AM', 'DD/MM/YYYY HH:MI:SSAM'), TO_DATE( '20/12/2014 03:30:00PM', 'DD/MM/YYYY HH:MI:SSAM') FROM DUAL

查询 1

WITH Differences AS (
  SELECT ID,
         TRUNC( START_DATE ) AS Day,
         LEAST(
           TRUNC( START_DATE ) + INTERVAL '1' DAY,
           END_DATE
         ) - START_DATE AS Diff
  FROM   MY_TABLE
  UNION
  SELECT ID,
         COLUMN_VALUE,
         CASE WHEN COLUMN_VALUE < TRUNC( END_DATE )
              THEN 1
              ELSE END_DATE - COLUMN_VALUE
              END
  FROM   MY_TABLE,
         TABLE( CAST( MULTISET (
           SELECT TRUNC( START_DATE ) + LEVEL
           FROM   DUAL
           WHERE  TRUNC( START_DATE ) + LEVEL <= TRUNC( END_DATE )
           CONNECT BY
                  TRUNC( START_DATE ) + LEVEL <= TRUNC( END_DATE )
         ) AS SYS.ODCIDATELIST ) )
)
SELECT ID,
       TO_CHAR( Day, 'YYYY-MM-DD' ) AS Day,
       TO_CHAR( TO_NUMBER( Diff * 24 ), '99D90' )
         || ' hour ' AS Hours
FROM   DIFFERENCES

Results

| ID |        DAY |        HOURS |
|----|------------|--------------|
|  1 | 2014-12-14 |  15.00 hour  |
|  1 | 2014-12-15 |  24.00 hour  |
|  1 | 2014-12-16 |  24.00 hour  |
|  1 | 2014-12-17 |   3.50 hour  |
|  2 | 2014-12-20 |   6.50 hour  |

【讨论】:

    猜你喜欢
    • 2020-10-06
    • 1970-01-01
    • 1970-01-01
    • 2017-09-21
    • 2018-08-17
    • 2017-06-03
    • 1970-01-01
    • 2023-01-21
    • 1970-01-01
    相关资源
    最近更新 更多