我有一个Oracle SQL查询,我试图在MySQL中重写。
PS:日期在这里是任意的,在实际场景中我在Tableau中使用此自定义查询,它接受用户定义的日期。“参考开始日期”与“开始日期”进行比较。
Oracle SQL查询的一部分:
CASE WHEN psr.dt_orgn IS NULL THEN NULL
ELSE
CASE WHEN CAST('2017-05-22' AS DATE) >= CAST('2017-06-22' AS DATE) THEN TRUNC(psr.dt_orgn,'IW')
ELSE TRUNC(psr.dt_orgn + ((CAST('2017-06-22' AS DATE)-CAST('2017-05-22' AS DATE))*(INTERVAL '1' DAY)),'IW')
END
END) week
以上使用数据库中的现有日历表将日期转换为“周开始日期”,即该周的星期一日期
MySQL版本:
CASE WHEN psr.originated IS NULL THEN NULL
ELSE
CASE WHEN CAST('2017-05-22' AS DATE) >= CAST('2017-06-22' AS DATE) THEN DATE_ADD(psr.originated,
INTERVAL - WEEKDAY(psr.originated) DAY)
ELSE DATE_ADD(psr.originated + ((CAST('2017-06-22'AS DATE) - CAST('2017-05-22' AS DATE)) * (INTERVAL '1' DAY))
END
END) week
我使用的解决方案在MySQL中找到了“周开始日期”,如下所示:
DATE_ADD(mydate, INTERVAL(1-DAYOFWEEK(mydate)) DAY)
我这样做时遇到错误。 我的问题是如何在MySQL查询中将“1天间隔”应用于第二个其他条件?
或者是否有一个更简单的解决方案来获取MySQL的周开始日期?
答案 0 :(得分:2)
我猜你问的是如何获取任意DATE
值并返回最近一个星期一的DATE
值。在Oracle中,您可以使用TRUNC(datestamp, 'W')
来执行此操作。
这是在MySQL中实现它的一种方法:
FROM_DAYS(TO_DAYS(datestamp) -MOD(TO_DAYS(datestamp) -2, 7))
如果你想要星期天,你可以使用
FROM_DAYS(TO_DAYS(datestamp) -MOD(TO_DAYS(datestamp) -1, 7))
我在这里写了。 http://www.plumislandmedia.net/mysql/sql-reporting-time-intervals/
答案 1 :(得分:1)
您可以使用名为 dayname()的MySQL函数获取日期的日期,例如dayname(" 2006-04-24")将在星期一返回。在这种情况下,您只需将包含日期的行放入函数中。之后,您可以轻松比较两个日期。