当前位置: 首页 > 面试题库 >

使用DATE_ADD和列名作为间隔值

袁阿苏
2023-03-14
问题内容

我有一个表,其中包含产品,开始日期和时间间隔值:

product_name                    start_date              expiry_period
Domain Registration (1 Year)    2013-12-08 00:00:00     1 Year
Domain Registration (1 Year)    2013-12-01 00:00:00     1 Year
Website Hosting (Bronze)        2013-12-19 00:00:00     1 Year
Website Hosting (Silver)        2013-12-20 00:00:00     1 Year
Website Hosting (Silver)        2013-12-21 00:00:00     1 Year
Domain Registration (2 years)   2014-01-04 00:00:00     2 Year
Domain Registration (1 Year)    2014-01-04 00:00:00     1 Year
Website Hosting (Silver)        2014-01-06 00:00:00     1 Year
Domain Registration (2 years)   2014-01-06 00:00:00     2 Year
Domain Registration (1 Year)    2014-01-07 00:00:00     1 Year
Domain Registration (1 Year)    2014-01-10 00:00:00     1 Year
Website Hosting (Bronze)        2014-01-12 00:00:00     1 Year

我试图在我的select语句中添加一个计算值,以将间隔添加到start_date,以便我的数据集以编程方式返回开始日期和结束日期。

这是我目前所拥有的:

select 
    product_name, 
    start_date,
    expiry_period
    DATE_ADD(start_date, INTERVAL expiry_period) as end_date
from
    tbl_products

但是,它针对DATE_ADD行返回错误(错误的SQL语法)。

我读过的所有SO文章似乎都表示表达式和类型需要分开(即DATE_ADD(start_date, INTERVAL expiry_value expiry_type))-确实不是这种情况,我只能在一个字段中输入一个句点?

如果不能,并且由于我无法更改数据模式,推荐的处理方式是什么?我考虑过使用SUBSTRING_INDEX分割列,但这似乎也不起作用。


问题答案:

获得您的结果并非易事-因为您将其存储为纯文本1 Year或类似文本。这是 容许在动态地使用它INTERVAL构造-
MySQL的语法要求,你会点这两个区间数量和类型。

但是,有一种技巧可以解决此问题:

SELECT 
    product_name, 
    start_date,
    expiry_period,
    @num:=CAST(expiry_period AS UNSIGNED),
    @p  :=SUBSTR(expiry_period, CHAR_LENGTH(@num)+2),
    CASE
      WHEN @p='Year' THEN DATE_ADD(start_date, INTERVAL @num YEAR)
      WHEN @p='Month' THEN DATE_ADD(start_date, INTERVAL @num MONTH)
      WHEN @p='Day' THEN DATE_ADD(start_date, INTERVAL @num DAY)
      WHEN @p='Week' THEN DATE_ADD(start_date, INTERVAL @num WEEK)
    END AS end_date
FROM
    tbl_products

-如您所见,此查询依赖于事实,该数量始终排在第一位(因此CAST将精确提取该数量,因此,此后它可用于获取间隔长度)。但是无论如何,您都必须在子句中重新计算 所有可能的 间隔类型CASE

另一个好主意是-以统一的形式存储您的期间(例如,始终以天为单位)-因此,每行只存储一个数字(因此,1周= 7天,等等)



 类似资料:
  • 我在数据库中存储了两个字段,其中一个包含日期时间,另一个包含表示ISO-8601格式的持续时间的字符串(例如“P1MT2H”)。我希望能够将持续时间添加到SQL中的datetime列,似乎我应该能够使用< code>DATE_ADD来完成此操作,但我不知道是否有一种好的方法来将其转换为间隔。如果可能的话,我宁愿不用定义自己的sql函数来解析时间间隔。

  • 我正在尝试开发一个滑块,如果用户没有点击后退或前进按钮,它每5秒就会改变一次。 但是如果他(用户)这样做了,间隔会触发多次。。。为什么? 我将间隔保存在一个变量中,并清除该变量,因此我不知道为什么这不起作用。。。但是看看你自己: }); 感谢阅读;-)

  • 在新数据库表中命名列时,我遇到的一个常见问题是用于分类子类型的正确名称。最自然的列名通常是,但我尽量避免在命名中使用SQL关键字或保留词。 我知道在MySQL和Postgres中都是一个非保留关键字,所以我可以使用它,但是我应该吗? 使用作为列名的当前最佳实践是什么?是否有一个同义词如此广泛地等价以至于使用它是有意义的? 这些年来,我花了很多时间试图选择其他名字,在过去一周的讨论中,这两次出现,所

  • 我在for循环中有一个set interval函数,当它在set interval函数中时,如果它满足条件,就会发出警报并清除间隔。下面是我的代码,但它不工作。谁能告诉我这里的错误是什么。 谢谢 我试图解决的是:当本地时间与定时器数组中的时间匹配时,我需要每次获得警报(第0列;定时器[计数][0])。数组已经排序

  • 问题内容: 我需要创建一个逗号分隔的项目列表: 根据AngularJS文档,表达式中不允许使用控制流语句。这就是为什么我无法正常工作的原因。 有没有其他方法可以创建逗号分隔的列表? 编辑1 比以下更简单: 问题答案: 您可以这样进行: ..但我喜欢Philipp的回答:-)

  • 问题内容: 我在python中有此代码。 我将从这样的命令行运行此脚本 因此,我需要一种使len使用列表而不是变量的方法,我只想在var中给出列表的名称。 我知道在这个例子中我可以做 但是我的脚本上有13个列表,我需要一种方法,可以通过在命令行上输入的名称来引用它们。 问题答案: 尽管这在Python中是完全可能的,但不是必需的。最好的解决方案是不执行此操作,而是使用字典。 您会注意到脚本中有13