2017-07-06 27 views
0

所以我試圖過濾日期,但是例如,當我輸入下面的代碼時,無論年份如何,我都會在7月1日之後得到所有日期。包括2015年和2016年的項目。我做錯了什麼?原始的TicketDate列是我們數據庫中的文本格式,這就是我轉換的原因。爲什麼我的WHERE子句不會篩選日期列中的年份?

SELECT 
    EmplCode, 
    Comments, 
    EmplName, 
    CONVERT(NVARCHAR, CAST(TicketDate AS DATE), 1) AS TicketDate, 
    CreatedBy, 
    ActClockInTime, 
    ActClockOutTime, 
    AdjClockInTime, 
    AdjClockOutTime, 
    ROUND(TotActTime, 2) AS ActualTime, 
    ROUND(TotAdjTime, 2) AS AdjActualTime, 
    PayrollRate, 
    OverTime, 
    Holiday, 
    GLAcct 
FROM AttendDet 
WHERE 
    EmplCode IS NOT NULL 
    AND TicketDate > '07/01/17' 
ORDER BY TicketDate; 
+2

什麼數據類型是'TicketDate'?嘗試使用ISO日期常量:「2017-07-01」。 PSA:[ISO日期格式](https://xkcd.com/1179/)。 – HABO

回答

4

如果TicketDate不是date數據類型,那麼你需要將其轉換爲一個。

另外:唯一真正安全的格式在SQL Server中,至少datetimesmalldatetime,日期/時間文本是:YYYYMMDDYYYY-MM-DDThh:mm:ss[.nnn] - Bad habits to kick : mis-handling date/range queries - Aaron Bertrand

select 
    EmplCode, 
    Comments, 
    EmplName, 
    convert(varchar(30), cast(TicketDate as date), 1) as TicketDate, 
    CreatedBy, 
    ActClockInTime, 
    ActClockOutTime, 
    AdjClockInTime, 
    AdjClockOutTime, 
    round(TotActTime, 2) as ActualTime, 
    round(TotAdjTime, 2) as AdjActualTime, 
    PayrollRate, 
    OverTime, 
    Holiday, 
    glacct 
from AttendDet 
where EmplCode is not null 
    and convert(date,TicketDate) > '20170701' 
order by TicketDate; 

而且,始終包括大小varcharnvarchar

+0

謝謝,這個作品 –

+0

@CristianContreras樂意幫忙! – SqlZim