September 12, 2005 at 9:35 pm
i got table that show like this
no date etc
1 08-09-2005 12:10:05.000 eating
when i use query like this
select * from table1 where date = '08-09-2005'
it return nothing
so how to make simple query like that ???
to make clear the question is how to query that table only with date only n ignore the clock so they return all data on that day
thank's
manik095
September 12, 2005 at 10:14 pm
select * from table1 where date >= '08-09-2005' and date < '09-09-2005'
September 12, 2005 at 10:19 pm
okay remi - you beat me to it - I was going to suggest converting the date first so that he could then use any date as filter (instead of >= & <)....manik - at least now you have several choices....
manik - first convert your date column to the format that you want and then use the where clause to compare....recommended format however, is ISO - read this other post on this site that has a similar question....
so you would do something like this....
ISO yymmdd format....
SELECT * FROM myTable WHERE CONVERT(CHAR(8), date, 112) = '20050809'
USA mm-dd-yy format....
SELECT * FROM myTable WHERE CONVERT(VARCHAR, date, 110) = '08-09-2005'
**ASCII stupid question, get a stupid ANSI !!!**
September 12, 2005 at 10:40 pm
thank's i have tried using
select * from table1 where date >= '08-09-2005' and date < '09-09-2005'
that's work.
but is there some function that work like day() or month(),
in this case will retur only date ??
thanks all
September 12, 2005 at 11:31 pm
Yes there is :
dateadd(D, 0, datediff(d, 0, getdate()))
also don't use a function on a column on a where condition. You don't allow any indexes to be used in the query.
September 13, 2005 at 1:20 am
"also don't use a function on a column on a where condition. You don't allow any indexes to be used in the query"
Hmmm ... guess I've just got a super server then
Straight from Query Analyzer with table and field names changed to protect those who should not be spared. ( the liberal use of [] everywhere in the query should give you an idea though )
StmtText SELECT adv.[field1] , SUM(FLOOR(mth.[field2])) as [Amt1] , SUM(mth.[field3]) as [Amt2] FROM [DB].[dbo].[table1] adv INNER JOIN [DB].[dbo].[table2] mth ON adv.[table1id] = mth.[table1id] WHERE MONTH(mth.[field4]) = 9 AND YEAR(mth.[field4]) = 2005 GROUP BY adv.[field1]
(1 row(s) affected)
StmtText |--Compute Scalar(DEFINE: ([Expr1002]=If ([Expr1013]=0) then NULL else [Expr1014], [Expr1003]=If ([Expr1015]=0) then NULL else [Expr1016])) |--Stream Aggregate(GROUP BY: ([adv].[field1]) DEFINE: ([Expr1013]=COUNT_BIG(floor([mth].[field2])), [Expr1014]=SUM(floor([mth].[field2])), [Expr1015]=COUNT_BIG([mth].[field3]), [Expr1016]=SUM([mth].[field3]))) |--Sort(ORDER BY: ([adv].[field1] ASC)) |--Hash Match(Inner Join, HASH: ([mth].[table1Id])=([Expr1012]), RESIDUAL: ([Expr1012]=[mth].[table1Id])) |--Clustered Index Scan(OBJECT: ([DB].[dbo].[table2].[PK_table2] AS [mth]), WHERE: (datepart(month, [mth].[field4])=9 AND datepart(year, [mth].[field4])=2005)) |--Compute Scalar(DEFINE: ([Expr1012]=Convert([adv].[table1Id]))) |--Index Scan(OBJECT: ([DB].[dbo].[table1].[IX_table1_field1] AS [adv]))
(7 row(s) affected)
Ok, so it's doing index scans instead of seeks. Maybe that's what you meant.
--------------------
Colt 45 - the original point and click interface
September 13, 2005 at 6:41 am
Let me rephrase that. Won't allow the server to use an index SEEK.
September 13, 2005 at 12:52 pm
Performance ahh who needs it.
its all good.
Performance is all in the users experience and perception.
You can have a subsecond query, but if the user "Feels" that its slow, then the perceived performance is Poor.
You can also have some mega search return in 2 seconds, but if the user "Feels" its fast then perceived performance is Excelent.
September 14, 2005 at 7:29 am
Ok.. every now and then I post part of this.. maybe it's time to post the whole enchilada. Some of this is mine.. some is attributed to those smarter than myself but I keep a whole series of code snippets in a script that I call DateTimeFun.
Be sure and read the explanations in the commented out section below - Contributed by Kay-Ole Behrmann
DECLARE -- this section by Mark Gelatt
@Today SmallDateTime,
@LastMonth SmallDateTime,
@EndLastMonth SmallDateTime,
@ThisMonth SmallDateTime,
@EndThisMonth SmallDateTime,
@NextMonth SmallDateTime,
@EndNextMonth SmallDateTime
SET @Today = DATEADD(d,DATEDIFF(d,0,GETDATE()),0) -- Strip off time elements.. setting the time to Midnight
SET @ThisMonth = DateAdd(dd,-Day(@Today),@Today) + 1 -- Subtract the Days from this month PLUS one day to find the 1st of the month..
SET @EndThisMonth = DATEADD(DAY, -1, DATEADD(Month,1,@ThisMonth))
SET @LastMonth = DATEADD(mm,-1,@ThisMonth)
SET @EndLastMonth = DATEADD(DAY, -1, @ThisMonth)
SET @NextMonth = DATEADD(DAY,1,@EndThisMonth)
SET @EndNextMonth = DATEADD(DAY, -1, DATEADD(MONTH,2,@ThisMonth))
Select Today = @Today, LastMonth = @LastMonth, EndLastMonth = @EndLastMonth,
EndThisMonth = @EndThisMonth, NextMonth = @NextMonth, EndNextMonth = @EndNextMonth
-- Strip off hours.. or other work arounds.. Contributed by Kay-Ole Behrmann
SELECT .... WHERE CONVERT(varchar, @DateVal, 101) = '08/01/2003'
SELECT .... WHERE @DateVal BETWEEN '2003-08-01' AND '2003-08-01 23:59:59.997'
SELECT .... WHERE @DateVal >= '2003-08-01' AND DateVal < '2003-08-02'
SELECT .... WHERE CAST(FLOOR(CAST(@DateVal AS float)) AS datetime)='8/1/2003'
SELECT CAST(FLOOR(CAST(getdate() AS float)) AS datetime)
select CAST(CAST(GetDate() AS INT) AS DATETIME)
-- this one should run faster... (and my personal favorite - mg)
select DATEADD(d,DATEDIFF(d,0,getdate()),0)
-- or convert to Text
SELECT CONVERT(Varchar(10),GetDate(),120)
SELECT CONVERT(Varchar(10),GetDate(),101)
/*
Contributed by Kay-Ole Behrmann
All of the above work to get records on 8/1/2003 regardless of the time of day.
The first solution converts to varchar format "101", i.e. US-Format mm/dd/yyyy, and compares to a string.
Doing it this way however, chances are you forget leading zeros (8/1/2003) and get no results.
The second solution uses knowledge about the largest possible timepart in a datetime, wich is not a particularly
pretty way.
The third way is the classic one, using two date-only values with an implicit time of 00:00:00.0000 and forces
a "greater or equal" to midnight 8/1 and a "less than" midnight 8/2.
Answer #4 cuts off the time part of the datetime value by removing decimals from the converted float-value.
This makes use of the fact that conversion to a float stores the date in the integer-part and time in the decimals.
*/
-- Calculate lapsed Time ONLY.. no date..
SELECT TimeLapse = LTRIM(RTRIM(CAST(DATEDIFF(hh, DATEADD(d,DATEDIFF(d,0,getdate()),0), getdate()) AS char(10)))) + ':' +
CAST(DATEDIFF(mi, DATEADD(d,DATEDIFF(d,0,getdate()),0), getdate()) % 60 AS Char(2))
Hope this helps... someone... Mark
Viewing 9 posts - 1 through 8 (of 8 total)
You must be logged in to reply to this topic. Login to reply
This website stores cookies on your computer.
These cookies are used to improve your website experience and provide more personalized services to you, both on this website and through other media.
To find out more about the cookies we use, see our Privacy Policy