mysql語句問題,非常奇怪的現象

2022-06-01 11:32:14 字數 2983 閱讀 9854

1樓:

unix_timestamp(curdate())-dateline 是變數。

----

問題補充:

具體說unix_timestamp(curdate())可能是變數,變數就是實時變化的,當你第一次查詢

where unix_timestamp(curdate())-dateline)+86400<86400

這個條件的時候這個數值是滿足條件的,但是第二次查詢

where (unix_timestamp(curdate())-dateline)

這個條件的時候unix_timestamp(curdate())這部分有變化。按數學的角度分析

不等式兩邊同時加上一個數86400應該不改變不等式性質,但是如果

unix_timestamp(curdate())有變化那情況就完全不同了,where 的邏輯不等式

的boolean值(tree or false)就會改變,不知道這樣說清了沒。

2樓:傳說中的鷹王

dateline 是指發貼時 距1970.1.1 的秒數麼?

unix_timestamp(curdate())-dateline<0 是要選出當天的帖子?

我理解是資料型別的問題。

unix_timestamp(curdate())的到的結果是一個大整數,

如果它dateline大,則沒有問題,

如果它比dateline小,則得到的結果是0.

這也就是(unix_timestamp(curdate())-dateline)<0

與(unix_timestamp(curdate())-dateline)+86400<86400

不等價的原因所在

你可以測試一下.

如果要參與計算的話最好cast一下,轉換為有符號的整數

3樓:

最好說明一個你的:unix_timestamp(curdate())-deatline是什麼東東~~

還有就是你的表有沒什麼記錄,寫一個例子出來看一下

4樓:萌萌的末影人

[重新做了補充]

算了,我覺得我是理解樓主的意思了,樓主的疑問在於他認為

select * from discuz.cdb_threads where (unix_timestamp(curdate())-dateline)<0

返回的結果應該和

select * from discuz.cdb_threads where (unix_timestamp(curdate())-dateline)+86400<86400

是一樣的,兩者應該存在著毫無疑問的等價關係

那麼類似的,我們把兩個86400的部分替換成相同的值,他們的結果也都應該相同.

這樣理解是錯誤的,因為這是一個比較表示式,這個表示式的作用是用來判斷比較運算子的左邊和右邊是否成立,兩者並沒有等價的關係

令:當前時間 y = unix_timestamp(curdate())

記錄時間 x = dateline

那你做的幾個嘗式可以寫成:

x-y < 0 和 (x-y)+n < n

如果把樓主的幾個嘗試值代入其中:

x-y < 0

(x-y)+86400 < 86400;

(x-y)+76400 < 76400;

(x-y)+46400 < 46400;

(x-y)+54400 < 54400;

你看這幾個式子可能等價嗎?

為了說明問題,我們先來搞懂原始那個表示式的意義,其實where之前的部分可以忽略掉,重點在where以後的條件表示式部分

(unix_timestamp(curdate())-dateline)+86400 < 86400

unix_timestamp(curdate())是返回unix出生那天到當前日期的秒數,是當天的哦!

所以不管你今天什麼時候返回這個值,顯示的都是一樣的數字,我特地查了一下,到今天是1255881600

dateline不用多說,這個欄位應該是用相同的時間格式記錄了這條記錄生成的時間.

86400是一天內的總秒數

所以(unix_timestamp(curdate())-dateline)+86400 < 86400表示式就很清楚了

左邊 = (當前日期秒數 - 當前時間秒數) + 一天的秒數

右邊 = 一天的秒數

所以此條語句的作用是返回當天86400秒內產生的記錄

代入結果如下

我們假設正好有一條dateline記錄為1255881600

那麼條件表示式就應該是這樣:

(1255881600-1255881600)+86400 < 86400 我們得到的結果是86400 < 86400不成立,所以這條記錄就不會顯示.

而恰好(1255881600-1255881600) < 0當然也不會顯示,但這是無意義的,因為0秒內不會返回任何記錄當然表示式不成立,雖然都不成立,但意思卻大相徑庭.

這個條件語句的作用原本是顯示當天的記錄所以他實際表達的是一個範圍是否成立

假設dateline記錄是1255881600+1~86400 結果 < 86400 條件成立,這個範圍的記錄就會顯示

假設dateline記錄是1255881600-1~86400 那麼結果< 86400 條件不成立,就不會有記錄顯示

因此我判斷樓主做的幾個嘗試是理解錯了比較運算子"<"的作用.

在mysql中執行sql語句時遇到的奇怪問題!請指教!!!

5樓:

string querystring="select subnumber,subname,plannumber,factnumber,sub_table.teanumber,teaname"+" from sub_table,tea_table where"+

" sub_table.teanumber=tea_table.teanumber;";

from前面和where後面沒加空格

我發現非常奇怪的現象,我發現一個非常奇怪的現象

這是因為我們的大環境發生了變化。以前是日出而作 日落而息 現在是白天不清醒 晚上不睡覺 以前的夢想是大魚大肉,現在是原生野生態。人都在改變,更何況是貓。是因為你小時候看的不準。我發現一個很奇怪的現象?那個你能說的bai再詳細du一點嗎你知道是啥現象啊?zhi拜託拜託請回答dao我,謝謝了大姐?如版果...

mysql儲存過程的問題,mysql中的儲存過程是什麼意思啊

為什麼要執行 select id,name from x?這是結果語句,不是過程語句.mysql中的儲存過程是什麼意思啊 直白的講就是把sql語句進行封裝,然後留個介面,使用的時候直接呼叫介面。可以把對資料的各種處理寫在儲存過程裡 程式只需呼叫 或者 傳參就可以了 方便後期維護 執行速度也比程式裡要...

特別奇怪的問題,問個特別奇怪的問題

為什麼磁鐵從中斷掉後,斷裂面會相斥?馬頓臺北的b.k.回答問題333 1 一根磁棒,一端為n極,另一端為s極,自中間攔腰折斷,卻發現斷成兩根的磁棒有相斥的情形,若依同性相斥的原理,則斷裂的那兩端必為n n或s s了,而又一磁棒的兩端兩極必不相同,所以磁棒斷裂後也許在其兩段中某一段的兩極發生了磁極完全...