MS Access Date Format and Compare yields wrong result - sql

SELECT Format('06-12-2018','dd-MM-yyyy') > Format('31-07-2018','dd-MM-yyyy')
why i am getting output as '0' meaning false, while running this query on ms access ?

As dd-mm-yyyy is your local format, use DateValue:
SELECT DateValue('06-12-2018') > DateValue('31-07-2018')
or, if the values are hardcoded, though this makes little sense, simply:
SELECT #2018/12/06# > #2018/07/31#

Try this:
SELECT cdate(#06-12-2018#) > cdate(#31-07-2018#)

for datediff i think you need below type function
example
SELECT DateDiff("yyyy", #13/01/1998#, #09/05/2017#);

Related

How can I generate a random timestamp appended to getdate() in SQL Server?

The following sql select generates the current date and time:
select
Getdate() AS DueDate
which looks like:
2021-02-06 10:16:35.340
I'd like to use getdate() (or an equivalent alternative) to continue getting the current date but I'd like to randomize the time component. I am having trouble finding a workable solution within a select statement.
Any suggestions?
here is another way if you need to have random time for each row:
SELECT
DATEADD(SECOND ,RAND(CHECKSUM(NEWID())) * 86400,CONVERT(datetime,CONVERT(varchar(8),GETDATE(),112)))
FROM tablename
You can simply add another DATEADD around your expression. For example, using INFORMATION_SCHEMA:
SELECT DATEADD(MILLISECOND, RAND(ROW_NUMBER()OVER(ORDER BY C.ORDINAL_POSITION)) * 10000000, GETDATE())
FROM INFORMATION_SCHEMA.COLUMNS AS C
You can play around with the RAND() and ROW_NUMBER() functions to get the result you want. If you have a primary key with lots of gaps, that helps to randomize.

SQL - convert yyyy-MM-ddThh:mm:ssZ to simple date with no time

I need to convert date/time with this format yyyy-MM-ddThh:mm:ssZ to simple date with no time.
Example : 2020-10-21T07:28:48.021Z
to : 2020-10-21
CAST(XX AS TIMESTAMP) works fine, but it doesn't drop the time in my sql query as i would like.
Any idea ? Thanks !
Below is for BigQuery Standard SQL
select date('2020-10-21T07:28:48.021Z')
with output
cast(field as date) OR try_cast( field as date)
/*
Try cast will not return error if it is not convertable it will return null*/
It's done differently in different databases, but in DB2, it's super simple:
select date(thatTimestamp)
from sysibm.sysdummy1;
HTH !
you want cast( 2020-10-21T07:28:48.021Z as date)
or
select cast(dateField as date) as [DateFieldName]

Subtract table value from today's date - SQL

I am trying to return the number of years someone has been a part of our team based on their join date. However i am getting a invalid minus operation error. The whole getdate() is not my friend so i am sure my syntax is wrong.
Can anyone lend some help?
SELECT
Profile.ID as 'ID',
dateadd(year, -profile.JOIN_DATE, getdate()) as 'Years with Org'
FROM Profile
MySQL Solution
Use the DATE_DIFF function
The DATEDIFF() function returns the time between two dates.
DATEDIFF(date1,date2)
http://www.w3schools.com/sql/func_datediff_mysql.asp
This method only takes the number of days difference. You need to convert to years by dividing by 365. To return an integer, use the FLOOR method.
In your case, it would look like this
SELECT
Profile.ID as 'ID',
(FLOOR(DATEDIFF(profile.JOIN_DATE, getdate()) / 365)) * -1 as 'Years with Org'
FROM Profile
Here's an example fiddle I created
http://sqlfiddle.com/#!9/8dbb6/2/0
MsSQL / SQL Server solution
The DATEDIFF() function returns the time between two dates.
Syntax: DATEDIFF(datepart,startdate,enddate)
It's important to note here, that unlike it's MySql counterpart, the SQL Server version takes in three parameters. For your example, the code looks as follows
SELECT Profile.ID as 'ID',
DATEDIFF(YEAR,Profile.JoinDate,GETDATE()) as difference
FROM Profile
http://www.w3schools.com/sql/func_datediff.asp
Looks like you're using T-SQL? If so, you should use DATEDIFF:
DATEDIFF(year, profile.JOIN_DATE, getdate())
Using the method from this answer, you can get your result with the following query :
SELECT
Profile.ID as 'ID',
YEAR(getdate()) - YEAR(profile.JOIN_DATE) - (DATE_FORMAT(getdate(), '%m%d') < DATE_FORMAT(profile.JOIN_DATE, '%m%d')) as 'Years with Org'
FROM Profile
If this is MS SQL:
SELECT
Profile.ID as 'ID',
DATEDIFF(YEAR,Profile.JoinDate,GETDATE())
FROM Profile

how to use like and between in where clause in same statement?

Im trying to find a set of results in a database based on dates. The dates are stored as varchars in the format dd/mm/yyyy hh:mm:ss.
What i would like to do is search for all dates within a range of specified dates.
For example i tried:
SELECT * FROM table_name
WHERE fromDate BETWEEN LIKE '%12/06/2012%' AND LIKE '%16/06/2012%'
Is something like this possible or is there a better way of doing this type of statement, because so far i have had little success?
I'm using Microsoft SQL server 2008.
Peter
Since your date values also include time, you can't use BETWEEN. The only safe way to do this is:
SELECT <cols> FROM dbo.table_name
WHERE CONVERT(DATE, fromDate, 103) >= '20120612'
AND CONVERT(DATE, fromDate, 103) < '20120617';
But as Martin noticed, you'll never be able to use an index on that column, so this will always perform a full table scan.
If you really, really want to use BETWEEN, converting to DATE is the only safe way to do so (well, or trimming the time off in other, less efficient ways):
SELECT <cols> FROM dbo.table_name
WHERE CONVERT(DATE, fromDate, 103) BETWEEN '20120612' AND '20120616';
But for consistency reasons I recommend against between even in that case.
Try This
SELECT * FROM table_name
WHERE Convert(Date,fromDate,103)
BETWEEN '20120612' AND '20120616'
The best solution is to store your varchars as DateTime in the database.
Second best is to convert then to dates in the select (as the other answers just indicates so I am not going to give the example)
The following works fine for me. Try this:
SELECT *
FROM [MABH-Desi-Dera].[dbo].[Order]
WHERE (CONVERT(nvarchar,[Order_ID]) BETWEEN '200622%' AND '200623%')
Here the Order_IDs start with some Date:
hi man this is not a rocket science bro
just make a logic like
Blockquote
SELECT * FROM table_name
WHERE fromDate BETWEEN '2021-05-01 12:00:00' AND '2021-05-01 23:59:00'
Blockquote
it will work I stuck too but it helps. i was also trying make a logic like u

Oracle to SQL server Date conversion

I would like to convert an Oracle SQL query into SQL server query.
But I encountered a problem with the following line :
AND to_date(to_char(M_DATE,'DD-MM-YYYY')) = '27/01/12'
M_DATE : DATE NOT NULL
I use
to_char(DATE,'DD-MM-YYYY')
in order to get their data like that : DD-MM-YYYY 00:00:00.000 (data are stocked like : 25/02/12 15:32:06.578)
So I searched on the Internet, but I didn't find any available solution. But I'm not an experienced SQL user, so if anybody know the solution..
Thanks
In general when removing any time values from a date I would use Date functions rather than converting to string
DATEADD(DAY, 0, DATEDIFF(DAY, 0, GETDATE()))
instead of
CONVERT(VARCHAR, GETDATE(), 103)
Although the end result is the same you are maintaining date format and while I have no specific results sets to prove it conclusively I have found this to be much quicker when dealing with large quantities of data.
In Oracle, I would remove the time element of a datetime using trunc - like so:
AND trunc(M_DATE) = ...
In SQLServer, I would convert to a date - like so:
AND convert(date,M_DATE) = ...
SELECT CONVERT(VARCHAR(25), GETDATE(), 131)
You could just do:
AND convert(varchar(8), M_DATE, 3) = '27/01/12'
Of course, that won't work if you have dates from other centuries.
I'm not sure what you mean by "data are stocked like"; be aware that the Microsoft SQL Server DATE type only has a precision of one day. If you want to have the time as well as the day, you should use the DATETIME2 type