国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術文章
文章詳情頁

數據庫 - mysql 計算某個時間,多少天后,多少個月后時間戳

瀏覽:95日期:2022-06-21 11:49:11

問題描述

idstart_timeperiod_ytpeperiod_value11461427200day321461427200month2

如上表,start_time 表示開始時間,period_ytpe 表示期限類型,period_value表示期限值,

第一第記錄表是 3天,第二條表示2個月

如果查詢出,從start_time開始,期限在今天之前的記錄

比如:第一條,start_time開始, 三天后的時間戳,如果是在今天(2016-06-04)之前,則是滿足條件!第二條,start_time開始, 兩個月后的時間戳,如果是在今天(2016-06-04)之前,則是滿足條件!

____________________________________分割線_________________________________________

感謝各位的回答,在不改數據庫的情況下(數據表已經被很多地方引用,且不是我設計),我自己寫了一條SQL,做了幾步轉換,感覺性能不會好,但好像可以用了,還好這個表數據量不大,每天最多新增一條新記錄。

把開始start_time轉為date,再DATE_ADD加上 日或者月,得到時間再轉為 unix_time用今天凌晨 UNIX_TIMESTAMP(CURDATE())減去 上面得到的時候,如果結果大于 0,那就是想要的結果

SELECT `id`,`name`,CASE `period_type` WHEN ’day’ THEN UNIX_TIMESTAMP(CURDATE())-UNIX_TIMESTAMP(DATE_ADD(FROM_UNIXTIME(`start_time`),INTERVAL period_value day)) WHEN ’month’ THEN UNIX_TIMESTAMP(CURDATE())-UNIX_TIMESTAMP(DATE_ADD(FROM_UNIXTIME(`start_time`),INTERVAL period_value month)) ELSE ’’ END AS ’time_interval’FROM `table`WHERE `xxxxxxx’HAVING time_interval>0ORDER BY time_interval desc

問題解答

回答1:

不知道你用的啥語言。用最笨的辦法~~先用你的語言獲取到今天的時間戳。例如1465056000

SELECT * FROM `table` WHERE `period_ytpe` = ’day’ AND `start_time` + 86400*`period_value` < 1465056000UNIONSELECT * FROM `table` WHERE `period_ytpe` = ’month’ AND `start_time` + 86400*30*`period_value` < 1465056000

當然缺陷就是,一個月默認當他30天了。如果你是要用mysql去計算。。那把start_time存成時間類型吧。。然后用date_add去計算

AND話外題。。為啥設計表的時候不直接算好end_time呢?非要篩選的時候去用,計算類的會導致索引失效,很不好。各種掃表

回答2:

時間存儲建議將字段設置為 timestamp 或者 datetime 類型, 而不是數值類型的時間戳.首先數值類型的時間戳不便於 SQL 中查詢, 另代碼中也需要進行轉換在數值類型 SQL 中相關函數也無法使用, 需要先對數值類型時間戳轉換城 timestamp 或者 datetime 類型在計算

如果是 timestamp 或者是 datetime 可以使用 date_add 函數增加或者減少時間達到時間的要求

http://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_date-add

例如

select date_add(start_time, interval 1 day) from t

給 start_time 增加一天

回答3:

明確問題,你應該是要求start_time在某天或者某月之后的時間戳。思路:用當前時間轉換成date格式,將date加上你要獲取的某天或某月的數值,然后將結果轉成時間戳date_add(date,interval n exp)其中date為date時間格式,如果是時間戳需要轉換,exp可以為SECOND 秒 SECONDS MINUTE 分鐘 MINUTES HOUR 時間 HOURS DAY 天 DAYS MONTH 月 MONTHS YEAR 年 YEARS MINUTE_SECOND 分鐘和秒 'MINUTES:SECONDS' HOUR_MINUTE 小時和分鐘 'HOURS:MINUTES' DAY_HOUR 天和小時 'DAYS HOURS' YEAR_MONTH 年和月 'YEARS-MONTHS' HOUR_SECOND 小時, 分鐘, 'HOURS:MINUTES:SECONDS' DAY_MINUTE 天, 小時, 分鐘 'DAYS HOURS:MINUTES' DAY_SECOND 天, 小時, 分鐘, 秒 'DAYS HOURS:MINUTES:SECONDS'1.從start_time開始3天后的時間戳:MYSQL代碼如下

select UNIX_TIMESTAMP(date_add(FROM_UNIXTIME(start_time), interval 3 day)) from t

3代表你要加的天數,將T換成你的數據庫的任意表執行即可2.從start_time開始N月后的時間戳:

select UNIX_TIMESTAMP(date_add(FROM_UNIXTIME(start_time), interval 3 MONTH)) from t

此函數數MYSQL的,其他數據庫也有相應的函數,但是沒有測過。

回答4:

試著寫了一下,失敗了。期望的SQL:

SELECT * FROM tableWHERE start_time < UNIX_TIMESTAMP(DATE_SUB(CURRENT_DATE, INTERVAL `period_value` `period_type`));

結果以上SQL語法有誤,較為接近的SQL:

SELECT * FROM tableWHERE start_time < UNIX_TIMESTAMP(DATE_SUB(CURRENT_DATE, INTERVAL `period_value` DAY));

但這就用不上period_type字段了。

其實正如@lyt8384 所說,在SQL語句里運用不適當的運算會讓索引失效的,查詢效率也會相應下降。如果有權限改變表結構的話,可以新增一個end_time字段,end_time(單位:s)=start_time + period_type * period_value,然后對end_time字段做索引,這樣做應該比較好。

主站蜘蛛池模板: 91久久国产露脸精品免费 | 欧美精品免费在线 | 99九九99九九九视频精品 | 欧美日韩ay在线观看 | 怡红院色视频在线 | 亚洲欧美日韩国产vr在线观 | 久久久精品影院 | 国产精品成人免费综合 | 亚洲男人天堂av | 97视频免费观看 | 大片刺激免费播放视频 | 久久成人国产精品 | 久久久这里只有精品免费 | 久久免费大片 | 日本伊人精品一区二区三区 | 亚洲欧美日韩天堂 | 国产大乳孕妇喷奶水在线观看 | 日韩国产精品99久久久久久 | 免费中文字幕一级毛片 | 日本免费一区二区三区看片 | 国产三级香港三韩国三级 | 日韩久久久精品首页 | 黄网在线观看免费网站台湾swag | 男人和女人在床做黄的网站 | 欧美精品在线视频 | 成年视频国产免费观看 | 亚洲欧美精品中字久久99 | 欧美一级aⅴ毛片 | 国产一级大片 | 男人的天堂在线观看免费 | 国产亚洲精品久久久久久午夜 | 一级做a爰全过程免费视频毛片 | 欧美国产精品久久 | 欧美日韩一区二区在线 | 国产欧美另类性视频 | 亚洲国产精品免费观看 | 美女把张开腿男生猛戳免费视频 | 欧美国产日本高清不卡 | 日韩在线 | 中文 | 中文字幕一区日韩在线视频 | 国产成人精品一区 |