SQL 比较操作后的两个日期
SQL Comparing two dates after minipulation
我有以下查询。其目的是查找产品的订购时间,检查它们是否符合当天的条件,然后提供一个列表。
AND (
(NameType <> 'Salad' AND completeDate < DATE_FORMAT( NOW( ) , '%Y-%m-%d' ' 10:30:00' ) )
OR
(NameType = 'Salad' AND (
( DATE_FORMAT( completeDate , '%h:%i:%s' ) <= '14:00:00' )
AND DATE_ADD(DATE_FORMAT(completeDate,'%Y-(%m)-%d'), INTERVAL +1 DAY) < DATE_FORMAT(NOW(),'%Y-%m-%d')
)
)
OR
(NameType = 'Salad' AND (
( DATE_FORMAT( completeDate , '%h:%i:%s' ) > '14:00:00' )
AND DATE_ADD(DATE_FORMAT(completeDate,'%Y-(%m)-%d'), INTERVAL +2 DAY) < DATE_FORMAT(NOW(),'%Y-%m-%d')
)
)
)
逻辑:
If a Bagel is ordered before 10:30 it will arrive that day. If not it will arrive the next.
If a Salad is ordered before 14:00 it will arrive the next day. If after this, it will arrive in two working days.
(是的,我觉得很疯狂!)
因此,当前日期为 2015-05-06
还有一个table这样的;
|ID|NameType| completeDate |
|1 |Salad |2015-05-05 13:00:00|
|2 |Salad |2015-05-04 19:00:00|
|3 |Bagel |2015-05-05 08:00:00|
|4 |Bagel |2015-05-05 11:00:00|
应该输出,
|ID|NameType| completeDate |
|1 |Salad |2015-05-05 13:00:00|
|3 |Bagel |2015-05-05 08:00:00|
但是它忽略了 salad/ID 1!
这与我比较日期的方式有关吗?想知道将它们转换为字符串是否有帮助。
您在 '14:00:00'
中使用 24 小时军事时间,但在 '%h:%i:%s'
中使用 %h 的 12 小时常规时间(所以 1:30pm 会变成 '01:30:00'
).像这样格式化可能会有所帮助:
'%H:%i:%s'
问题与我比较两个字符串的方式有关。
将它们转换为 DATE
解决了问题。
AND (
(NameType <> 'Salad' AND completeDate < DATE_FORMAT( NOW( ) , '%Y-%m-%d' ' 10:30:00' ) )
OR
(NameType = 'Salad' AND (
( DATE_FORMAT( completeDate , '%H:%i:%s' ) <= '14:00:00' )
AND CAST(DATE_ADD(DATE_FORMAT(completeDate,'%Y-(%m)-%d'), INTERVAL +1 DAY) AS DATE) <= CAST(DATE_FORMAT(NOW(),'%Y-%m-%d') AS DATE)
)
)
OR
(NameType = 'Salad' AND (
( DATE_FORMAT( completeDate , '%H:%i:%s' ) > '14:00:00' )
AND CAST(DATE_ADD(DATE_FORMAT(completeDate,'%Y-(%m)-%d'), INTERVAL +2 DAY) AS DATE) <= CAST(DATE_FORMAT(NOW(),'%Y-%m-%d') AS DATE)
)
)
)
我有以下查询。其目的是查找产品的订购时间,检查它们是否符合当天的条件,然后提供一个列表。
AND (
(NameType <> 'Salad' AND completeDate < DATE_FORMAT( NOW( ) , '%Y-%m-%d' ' 10:30:00' ) )
OR
(NameType = 'Salad' AND (
( DATE_FORMAT( completeDate , '%h:%i:%s' ) <= '14:00:00' )
AND DATE_ADD(DATE_FORMAT(completeDate,'%Y-(%m)-%d'), INTERVAL +1 DAY) < DATE_FORMAT(NOW(),'%Y-%m-%d')
)
)
OR
(NameType = 'Salad' AND (
( DATE_FORMAT( completeDate , '%h:%i:%s' ) > '14:00:00' )
AND DATE_ADD(DATE_FORMAT(completeDate,'%Y-(%m)-%d'), INTERVAL +2 DAY) < DATE_FORMAT(NOW(),'%Y-%m-%d')
)
)
)
逻辑:
If a Bagel is ordered before 10:30 it will arrive that day. If not it will arrive the next.
If a Salad is ordered before 14:00 it will arrive the next day. If after this, it will arrive in two working days.
(是的,我觉得很疯狂!)
因此,当前日期为 2015-05-06
还有一个table这样的;
|ID|NameType| completeDate |
|1 |Salad |2015-05-05 13:00:00|
|2 |Salad |2015-05-04 19:00:00|
|3 |Bagel |2015-05-05 08:00:00|
|4 |Bagel |2015-05-05 11:00:00|
应该输出,
|ID|NameType| completeDate |
|1 |Salad |2015-05-05 13:00:00|
|3 |Bagel |2015-05-05 08:00:00|
但是它忽略了 salad/ID 1!
这与我比较日期的方式有关吗?想知道将它们转换为字符串是否有帮助。
您在 '14:00:00'
中使用 24 小时军事时间,但在 '%h:%i:%s'
中使用 %h 的 12 小时常规时间(所以 1:30pm 会变成 '01:30:00'
).像这样格式化可能会有所帮助:
'%H:%i:%s'
问题与我比较两个字符串的方式有关。
将它们转换为 DATE
解决了问题。
AND (
(NameType <> 'Salad' AND completeDate < DATE_FORMAT( NOW( ) , '%Y-%m-%d' ' 10:30:00' ) )
OR
(NameType = 'Salad' AND (
( DATE_FORMAT( completeDate , '%H:%i:%s' ) <= '14:00:00' )
AND CAST(DATE_ADD(DATE_FORMAT(completeDate,'%Y-(%m)-%d'), INTERVAL +1 DAY) AS DATE) <= CAST(DATE_FORMAT(NOW(),'%Y-%m-%d') AS DATE)
)
)
OR
(NameType = 'Salad' AND (
( DATE_FORMAT( completeDate , '%H:%i:%s' ) > '14:00:00' )
AND CAST(DATE_ADD(DATE_FORMAT(completeDate,'%Y-(%m)-%d'), INTERVAL +2 DAY) AS DATE) <= CAST(DATE_FORMAT(NOW(),'%Y-%m-%d') AS DATE)
)
)
)