AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 59849
Accepted
Sam Enbank
Sam Enbank
Asked: 2014-02-28 13:55:17 +0800 CST2014-02-28 13:55:17 +0800 CST 2014-02-28 13:55:17 +0800 CST

Firebird-时间间隔- 2 个日期之间

  • 772

我尝试选择公司成员的工作期限。

示例:加入日期:01.01.2001 今天:27.02.2014 现在,我想要这个:13 年 1 个月 27 天

我有一个适用于 MSSQL 的语句,但我无法将其转换为 firebird-SQL。

有人可以帮助我吗?

谢谢

埃里克

firebird date
  • 2 2 个回答
  • 8523 Views

2 个回答

  • Voted
  1. Best Answer
    rob c
    2016-02-11T10:02:12+08:002016-02-11T10:02:12+08:00

    相对绿色的 Firebird n00b 这里有一个公平的 PostgreSQL 背景,虽然专业的 GIS 工作主要集中在数据库设计和采购/清理/制作空间多源数据集(通常质量可疑),然后查询可映射的结果作为答案到特定的位置谜语。因此,工具箱在 Admin/Optimization/3rd Party Application Setup 等方面很轻。在接下来的几周内,您可能(错误地,将会)看到我提出的一些 Firebird 特定问题。提前致谢!对这个稍微老一点的 Firebird 问题进行了尝试,以感受一下日期处理和连接的新感觉。进行了比预期更多的调整和测试,我的涉猎可能不是最有效/最优雅的解决方案,但是,假设表员工中存在列join_date,这将起作用:

    SELECT Y ||' Years, '|| M ||' Months, and '|| D ||' Days'
    FROM
    (
    SELECT
    CASE WHEN datediff(year, join_date, current_date) <> datediff(day, join_date, current_date)/365
    THEN datediff(year, join_date, current_date)-1
    ELSE datediff(year, join_date, current_date)
    END as Y,
    CASE WHEN datediff(year, join_date, current_date) <> datediff(day, join_date, current_date)/365
    AND datediff(day, dateadd(month, datediff(month, join_date, current_date), join_date), current_date)<0
    THEN datediff(month, dateadd(year, datediff(year, join_date, current_date)-1, join_date), current_date)-1
    WHEN datediff(year, join_date, current_date) <> datediff(day, join_date, current_date)/365
    AND datediff(day, dateadd(month, datediff(month, join_date, current_date), join_date), current_date)>=0
    THEN datediff(month, dateadd(year, datediff(year, join_date, current_date)-1, join_date), current_date)
    WHEN datediff(year, join_date, current_date) = datediff(day, join_date, current_date)/365
    AND datediff(day, dateadd(month, datediff(month, join_date, current_date), join_date), current_date)<0
    THEN datediff(month, dateadd(year, datediff(year, join_date, current_date), join_date), current_date)-1
    ELSE datediff(month, dateadd(year, datediff(year, join_date, current_date), join_date), current_date)
    END as M,
    CASE WHEN datediff(day, dateadd(month, datediff(month, join_date, current_date), join_date), current_date)<0
    THEN datediff(day, dateadd(month, datediff(month, join_date, current_date)-1, join_date), current_date)
    ELSE datediff(day, dateadd(month, datediff(month, join_date, current_date), join_date), current_date)
    END as D
    FROM employees
    )
    

    当很明显时,子查询对我有条件:a)年和月的计算不考虑整个日期;b) 无论事件的顺序如何,日期减法都会愉快地返回负值。

    年/月/日 示例:datediff() 在检索 31.12.2015 和 1.1.2016 之间的天数、月数或年数时返回值 1。

    负值示例:当我使用以下方法计算天数减去整个月包含的天数时,大约 69% 的测试日期值小于零:

    SELECT datediff(day, dateadd(month, datediff(month, date_column, current_date), date_column), current_date) as D FROM date_table
    

    如果可以接受将 365 天替换为一年,我们可以简化子查询。该技巧适用于我的测试数据,但可能会在更广泛的日期范围内引发陷阱。简化的查询如下所示:

    SELECT Y ||' Years, '|| M ||' Months, and '|| D ||' Days'
    FROM
    (
    SELECT
    datediff(day, join_date, current_date)/365 as Y,
    CASE WHEN datediff(day, dateadd(month, datediff(month, join_date, current_date), join_date), current_date)<0
    THEN datediff(month, dateadd(year, datediff(day, join_date, current_date)/365, join_date), current_date)-1
    ELSE datediff(month, dateadd(year, datediff(day, join_date, current_date)/365, join_date), current_date)
    END as M,
    CASE WHEN datediff(day, dateadd(month, datediff(month, join_date, current_date), join_date), current_date)<0
    THEN datediff(day, dateadd(month, datediff(month, join_date, current_date)-1, join_date), current_date)
    ELSE datediff(day, dateadd(month, datediff(month, join_date, current_date), join_date), current_date)
    END as D
    FROM employees
    )
    

    如果我搞砸了,或者我使用了糟糕/过度劳累的逻辑,那就大喊大叫。希望它在某些时候对某人有帮助!留意新的 Firebird 问题(可能已经陷入与不会丢失的 JDBC 连接字符串的斗争中)。

    谢谢你,再次问好! - 抢

    我从来没有计划——匿名者

    • 0
  2. user70138
    2015-07-08T22:58:36+08:002015-07-08T22:58:36+08:00
    YEARS=DATEDIFF(YEAR FROM :BEGIN_DATE TO :END_DATE);
    MONTHS=DATEDIFF(MONTH FROM :BEGIN_DATE TO :END_DATE);
    DAYS=DATEDIFF(DAY FROM :BEGIN_DATE TO :END_DATE);
    
    • -2

相关问题

  • 如何设置一个列来获取现在的日期?

  • 在 Firebird 中存储事务敏感常量

  • 火鸟监控表

  • 在 asc 和 desc 方向上创建索引

  • Firebird 3.0 中的身份验证错误

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve