选择范围内最接近的周日

时间:2016-06-07 17:43:12

标签: sql date join

我有一个表“stocks_prices”,其中包含条目gvkey,iid,datecol和prccd。它代表datecol(YYYY-MM-DD)上股票的价格(prccd)(由其gvkey和iid表示)。我想查看我的所有数据,并在同一行中查看当月第一天的价格,并在其旁边显示datecol上的价格 - 35天(即35天前它的价格是多少),但它需要是一周工作日(周末没有参赛作品)。

现在我有了:

@echo off&setlocal enabledelayedexpansion
set "musicroot=D:\files"
set "playfolder=F:\dump"
set /a filecount=351

pushd "%musicroot%"
for /r %%i in (*.mp3) do set /a files+=1& set "$!files!=%%~i"
popd
pushd "%playfolder%"
:randomloop
set /a rd=%random%%%files+1
set "mp3=!$%rd%!"
if not defined mp3 goto :randomloop
set "$%rd%="
for %%i in ("%mp3%") do if exist "%%~nxi" echo "%%~nxi" already exist in %playfolder%.& goto:randomloop
copy "%mp3%"
set /a filecount-=1
if %filecount% gtr 0 goto:randomloop
popd

它有效,但不完全是我想要的方式(它看起来正好35天后,我希望它可以使用最接近的日期)。我希望这不是一个微不足道的问题,我只是开始使用MySQL。

提前谢谢。

1 个答案:

答案 0 :(得分:2)

您可以使用WEEKDAY功能获取月初最接近的工作日:

  • 如果第一天是星期六,则使用下周一
  • 如果第一天是星期日,则使用下周一
  • 否则,请自行使用。

以下是实施:

SELECT
    CASE WEEKDAY(datecol) 
        WHEN 5 THEN DATE_ADD(datecol, INTERVAL 2 DAY) -- Sat  Mon
        WHEN 6 THEN DATE_ADD(datecol, INTERVAL 1 DAY) -- Sun  Mon
        ELSE datecol
    END AS first_weekday
FROM stocks_prices

-35天正好是5周前。因此,当前datecol的工作日与5周前相同。这是结果:

SELECT
    b1.gvkey,
    b1.iid,
    b1.datecol,
    b1.prccd, 
    b2.datecol as '35days',
    (b2.prccd - b1.prccd)/b1.prccd
FROM stocks_prices b1
    LEFT JOIN stocks_prices b2
        ON b1.datecol = DATE_ADD(b2.datecol, INTERVAL 35 DAY) 
        AND b1.gvkey = b2.gvkey
        AND b1.iid = b2.iid
WHERE b1.datecol IN
(
    SELECT
        CASE(WEEKDAY(datecol))
            WHEN 5 THEN DATE_ADD(datecol, INTERVAL 2 DAY) -- Sat -> Mon
            WHEN 6 THEN DATE_ADD(datecol, INTERVAL 1 DAY) -- Sun -> Mon
            ELSE datecol
        END
    FROM stocks_prices
    WHERE DAY(datecol) = 1
)