在Mysql日期之间无法正常工作

时间:2017-03-28 10:42:40

标签: php mysql sql

我想使用MySQL根据两个不同的日期过滤一些项目。在我的数据库中,我存储了2017-03-28 10:55:10之类的数据。但我只需要日期部分,而不是时间所以我使用了DATE()函数:

select sum(cashamount) as sumcashsalesamount,
       DATE(transactiondate) as datepart 
from master_transaction 
where transactiondate BETWEEN '2017-02-22%' AND '2017-03-28%' 
order by transactiondate desc

此查询上方有两个日期2017-02-22%2017-03-28%,但这不会返回任何结果。

但是当我将此2017-03-28%日期更改为2017-03-29%(明天日期)时,我会得到结果。

6 个答案:

答案 0 :(得分:4)

不要将between与"日期"一起使用。我把它放在引号中,因为你的值实际上是日期时间值。

写这个条件的最好方法是:

where transactiondate >= '2017-02-22' and
      transactiondate < '2017-03-29' 

注意第二个条件的不等式。 BETWEEN具有包容性,因此将包括2017-03-28的午夜。

为什么这是最好的?

  • 它允许查询优化器利用索引和分区。
  • 这正是你想要的逻辑。
  • 适用于datedatetime类型。

答案 1 :(得分:2)

BETWEEN包含双方,如果没有为日期指定时间组件,则默认为00:00:00。自2017-03-28 10:55:10&gt; 2017-03-28 00:00:00它未包含在结果集中。

答案 2 :(得分:1)

2017-03-28% = 2017-03-28 00:00:00

如果当天发生了某些事情,您需要2017-03-28 23:59:59date_sub(2017-03-29, INTERVAL 1 second)才能轻松

答案 3 :(得分:1)

您只能对LIKE使用通配符(%)。

使用:

where date(transactiondate) BETWEEN '2017-02-22' AND '2017-03-28' 

答案 4 :(得分:0)

如果您在今天之间使用并且想要今天,那么您必须整天明天

答案 5 :(得分:0)

我解决了我的问题

Option Explicit

Sub SendFiles()
    Dim objOutLook As Object
    Dim fso As Object
    Dim strFile As String
    Dim fsoFile
    Dim fsoFldr
    Dim dtNew As Date, sNew As String
    Dim newOutlookInstance As Boolean

    Set fso = CreateObject("Scripting.FileSystemObject")

    If GetOutlook(objOutLook, newOutlookInstance) Then

        strFile = "C:\temp\" 'path to folder
        Set fsoFldr = fso.GetFolder(strFile)
        dtNew = Now() - TimeValue("00:00:30") '30 seconds ago

        For Each fsoFile In fsoFldr.Files
            If fsoFile.DateCreated > dtNew Then
                sNew = fsoFile.Path
                With objOutLook.CreateItem(olMailItem)
                    .To = "email@address.com"
                    .Subject = "Example"
                    .BodyFormat = olFormatPlain
                    .Attachments.Add sNew
                    .Importance = olImportanceHigh
                    .Send
                End With
            End If
        Next
        If newOutlookInstance Then objOutLook.Quit '<--| quit Outlook if an already running instance of it hasn't been found
        Set objOutLook = Nothing

    Else
        MsgBox "Sorry: couldn't get a valid Outlook instance running"
    End If

End Sub



Function GetOutlook(objOutLook As Object, newOutlookInstance As Boolean) As Boolean
    Set objOutLook = GetObject(, "Outlook.Application")
    If objOutLook Is Nothing Then
        Set objOutLook = New Outlook.Application
        newOutlookInstance = True
    End If
    GetOutlook = Not objOutLook Is Nothing
End Function

我只是将DATE(transactiondate)重新放置在条件有效的地方