2014-12-02 11 views
22

Nie mogę odjąć 30 dni od bieżącej daty i jestem początkującym użytkownikiem programu SQL Server.Odejmowanie 30 dni od bieżącej daty przy użyciu serwera SQL Server

to dane w mojej kolumnie

date 
------------------------------ 
Fri, 14 Nov 2014 23:03:35 GMT 
Mon, 03 Nov 2014 15:18:00 GMT 
Tue, 11 Nov 2014 01:24:47 GMT 
Thu, 06 Nov 2014 19:13:47 GMT 
Tue, 04 Nov 2014 12:37:06 GMT 
Fri, 1 Nov 2014 00:33:00 GMT 
Sat, 5 Nov 2014 01:06:00 GMT 
Sun, 16 Nov 2014 06:37:12 GMT 

do tworzenia powyższą kolumnę użyłem varchar(50) a teraz mój problem jest chcę, aby wyświetlić terminy ostatnich 15-20 dniach od kolumnie data może ktoś pomóc w tym problemie? aktualizacja [jak mogę wyświetlić daty z ostatnich 7 dni w kolejności

+8

[Złe nawyki kopać: wybiera niewłaściwy typ danych] (http: // sqlblog. com/blogs/aaron_bertrand/archive/2009/10/12/bad-habits-to-kick-using-the-wrong-data-type.aspx) - powinieneś zawsze używać najbardziej odpowiedniego typu danych - to właśnie oni tam, po wszystkim! Jeśli chcesz przechowywać daty, użyj 'DATA' lub' DATETIME2 (n) '- ale z całą pewnością ** NOT ** kolumna' varchar'! –

+0

hej, to naprawdę przydatne dla człowieka informacje i aktualizuję kolumnę – Madpop

Odpowiedz

45

Możesz przekonwertować na datetime, a następnie użyć DATEADD(DAY, -30, date).

Zobacz here.

edit

podejrzewam, wielu ludzi jest znalezienie na to pytanie, ponieważ chcą, aby odjąć od bieżącej daty (jak tytuł pytanie, ale nie ma co OP). Komentarz do munyla poniżej odpowiada na to pytanie bardziej szczegółowo. Ponieważ komentarze są uważane eteryczny (może być usunięta w danym momencie), będę powtarzać tutaj:

DATEADD(DAY, -30, GETDATE()) 
+5

Dzięki. 'DATEADD (DZIEŃ, -30, GETDATE())' działał jak czar ... – munyul

+0

Prosty i genialny! – Hans

+0

Dla każdego, kto się zastanawia, możesz zamienić DAY na metodę z MONTH, aby zrobić to samo dla różnicy miesięcznej. Wyobrażam sobie, że działa jakaś poprawna wartość datetime. – MattD

1
SELECT DATEADD(day,-30,date) AS before30d 
FROM... 

Jednak zaleca się, aby utrzymać datę w kolumnie datetime, nie varchar.

7

TRY TO:

Obsada swoją wartość VARCHAR do DATETIME i dodać -30 do odejmowania. Ponadto w formacie sql-server format pt, 14 listopada 2014 23:03:35 GMT nie został przekonwertowany do DATETIME. Spróbuj podciąg do niego:

SELECT DATEADD(dd, -30, 
     CAST(SUBSTRING ('Fri, 14 Nov 2014 23:03:35 GMT', 6, 21) 
     AS DATETIME)) 
4

Spróbuj tego:

SELECT  GETDATE(), 'Today' 
UNION ALL 
SELECT  DATEADD(DAY, 10, GETDATE()), '10 Days Later' 
UNION ALL 
SELECT  DATEADD(DAY, –10, GETDATE()), '10 Days Earlier' 
UNION ALL 
SELECT  DATEADD(MONTH, 1, GETDATE()), 'Next Month' 
UNION ALL 
SELECT  DATEADD(MONTH, –1, GETDATE()), 'Previous Month' 
UNION ALL 
SELECT  DATEADD(YEAR, 1, GETDATE()), 'Next Year' 
UNION ALL 
SELECT  DATEADD(YEAR, –1, GETDATE()), 'Previous Year' 

zestaw wyników:

———————– ————— 
2011-05-20 21:11:42.390 Today 
2011-05-30 21:11:42.390 10 Days Later 
2011-05-10 21:11:42.390 10 Days Earlier 
2011-06-20 21:11:42.390 Next Month 
2011-04-20 21:11:42.390 Previous Month 
2012-05-20 21:11:42.390 Next Year 
2010-05-20 21:11:42.390 Previous Year