String to datetime in update query - sql

I already have a successful update query that joins tables to enter the date from the PROJECT_CLEAN table into the TABLE_PROGRESS table to show the most recent record for each evaluation unit (EU), but it keeps the date-time as a string, which I can't really do any analysis with.
I need to adjust this update query slightly to take the string version from the PROJECT_CLEAN table ("YYYY-MM-DD HH:MM:SS") and convert it to datetime (YYYY-MM-DD HH:MM:SS) in the TABLE_PROGRESS table. Here is the existing query:
UPDATE IGNORE TABLE_PROGRESS AS prog
JOIN (SELECT cast(EU AS UNSIGNED) AS eu, MAX(START_TIME) AS max, CLUSTER_COMPLETE AS complete FROM `PROJECT_CLEAN` GROUP BY EU) AS project
ON prog.EUID = project.EU
SET prog.Date_Completed = project.max
WHERE project.complete>0;
Any help will be greatly appreciated!

I figured it out. I just had to clear out the TABLE_PROGRESS table and make sure the date fields had the right format... and then the same query still worked and now the dates are no longer strings
– beck777 May 6 at 16:49

Related

Filter DateTime in MS Acess 2010 Database

I have 5070 rows in a Table. But in that many entries are dump entries. I simply want to ignore them. In dump entries I have 1900-01-01 00:00:00 this data in many rows, I want to ignore all the rows which is having above data.
My query looks like this
Select * from Table where AttendanceDate > #1900-01-01 00:00:00#
I tried using CDate(1900-01-01 00:00:00), "#1900-01-01 00:00:00#", <> #1900-01-01 00:00:00# as well, but nothing helps.
I have gone throuh around 15-20 SO Questions and tried their marked answers but didn't work.
EDIT
I have data like this. I want to filter data that has InTime > 1900-01-01 00:00:00.
The table has only 650 valid entries from 5070 entries. I want to remove all the other extradump entries.
Any help would be appreciated!
Thank you
As suggested in the comments you have to use the date literals in the format #MM/dd/yyyy HH:mm:ss#.
So "SELECT * FROM tbl1 WHERE Datum > #1/1/1900 00:00:00#" should work in your case. Best practise is to use parameters as mentioned in the comments but the previous SQL statement should just work fine for you.
The data type of the field in question shoud be date/time.
PS: One could use the DateValue function to convert the text in date but this will cause trouble as one can never be sure if the conversion has been successful. IMHO it's best to have the correct data type from the very beginning
"SELECT * FROM tbl1 WHERE DateValue(Datum) > #1/1/1900 00:00:00#"

applying knowledge of SQL for everyday workplace activities

My question is how to properly write a SQL query for the below highlighted/bold question.
There is a table in HMO database which stores doctor's working
hours.Table has following fields
"FirstName","LastName","Date","HoursWorked". write a sql statement
which retrieves average working hours for period January-March for a
doctor with name Joe Doe.
so far i have
SELECT HoursWorked
FROM Table
WHERE DATE = (January - March) AND
SELECT AVG(HoursWorked) FROM Table WHERE FirstName="Joe",LastName="Doe"*
A few pointers as this sounds like a homework question (which we don't answer for you here, but we can try to give you some guidance).
You want to put all the things you want to return from your select first and you want to have all your search conditions at the end.
So the general format would be :
SELECT Column1,
Column2,
Column3,
FROM YourTable
WHERE Column4 = Restriction1
AND Column5 = Restriction2
The next thing you need to think about is how the dates are formatted in your database table. Hopefully they're kept in a column of type datetime or date (options will depend on the database engine you're using, eg, Microsoft SQL Server, Oracle or MySql). In reality some older databases people use can store dates in all sorts of formats which makes this much harder, but since I'm assuming it's a homework type question, lets assume it's a datetime format.
You specify restrictions by comparing columns to a value, so if you wanted all rows where the date was after midnight on the 2nd of March 2012, you would have the WHERE clause :
WHERE MyDateColumn >= '2012-03-02 00:00:00'
Note that to avoid confusion, we usually try to format dates as "Year-Month-Day Hour:Minute:Second". This is because in different countries, dates are often written in different formats and this is considered a Universal format which is understood (by computers at least) everywhere.
So you would want to combine a couple of these comparisons in your WHERE, one for dates AFTER a certain date in time AND one for dates before another point in time.
If you give this a go and see where you get to, update your question with your progress and someone will be able to help get it finished if you have problems.
If you don't have access to an actual database and need to experiment with syntax, try this site : http://sqlfiddle.com/
you already have the answer written
SELECT AVG(HoursWorked) FROM Table WHERE FirstName="Joe",LastName="Doe"*
you only need to fix the query
SELECT AVG(HoursWorked) as AVGWORKED FROM Table WHERE FirstName='Joe' AND LastName='Doe'
That query will give you the average hours worked for Joe Doe, however you only need to get between some time you add the next "AND", if you are using SQL server you can use the built in function DateFromParts(year,month,day) to create a new Date, or if you are using another Database Engine you can convert a string to a DateColumn Convert(Date,'MM/dd/yyyy')
Example
SELECT AVG(HoursWorked) as AVGWORKED FROM Table WHERE FirstName='Joe' AND LastName='Doe' AND DateColumn between DateFromParts(year,month,day) and Convert(Date,'MM/dd/yyyy')
In the example i showed both approaches (datefromparts for the initial date, and convert(date) for the ending date).

Converting date-time format and querying based on a date condition in SQL

I have around 20,000 entries in a SQL table for which a date column is of the form
YYYY-MM-DD HH-SS. I would like to convert this format to a YYYY-MM-DD format so I can run a query on all of the entries that will count the number of entries based on
a) the month under which they fall
b) the day
I'm new to SQL and not sure if there is a way to loop through all of the entries and check based on the required criteria; and as such, would greatly appreciate any help.
I unfortunately, cannot send a screenshot of the table since the data is classified.
You don't need to change the data in the table. Most databases have year() and month() functions, so you could do:
select year(datecol), month(datecol), count(*)
from sqltable
group by year(datecol), month(datecol)
order by year(datecol), month(datecol);
If these specific functions are not available, then I'm sure your database supports something similar.

Default value for datetime

How can you search for dates (datetimes) that contain a default value i.e. ''. I guess it is not:
select * from table where dateofbirth=''
All the dates seem to have a default value of '1900-01-01'. However, there are people in my database who have a date of birth on or before this date (histroic people mainly). Therefore I cannot do:
select * from table where dateofbirth='1900-01-01'
I know that some versions of SQL Server have a default date of: 1899-12-31.
I guess it is better to use nulls for unknown dates. I cannot do that in this case.
I have read through lots of questions on here about finding dates using SQL but I have not found an answer to my specific question.
You can get the default DateTime value as;
SELECT CONVERT(DATETIME, 0)
And apply it to the filter as appropriate;
SELECT * FROM [Table] WHERE DateOfBirth = CONVERT(DATETIME, 0)
Or if you need to select earlier dates then;
SELECT * FROM [Table] WHERE DateOfBirth <= CONVERT(DATETIME, 0)
Fiddle example
The best you are going to get is what you listed:
select * from table where dateofbirth='1900-01-01'
As you know, the problem is that if someone was really born on 1/1/1900, you will also include them. But there's really no way for your query to know the difference.
To fix this, you would need to change what your system is using for the default value (e.g. NULL or change to datetime2 or date datatype and use 1/1/0001). Then update all your 1/1/1900 values to the new default value. Yes, this will erroneously update any existing people with 1/1/1900 birthdays, but at least it will prevent any future occurrences.
In SQL Server terms a default value for column X is only used when a new record is first created and a value is not provided for that column. After the initial creation of the record the value is just a value, same as any other. Within a single table there is no way to distinguish between records that that hold the default value in column X because it was supplied, or because it was defaulted.
This won't help you now, but an alternative to nulls that is sometimes used is to use a 'magic value'. In the case of dates of births, the maximum datetime value of 31st December 9999 could be used to indicate an unknown value (assuming your system isn't expected to be in use in 8,000 years time :) Some people (including me) don't really approve of the use of magic values because there's no way in the database of indicating their magic status.
Rhys

Date/Time data types and declaration in SQL Server

I would like to have a date and time column in my table. The main purpose of having these 2 columns is to be able to return query results like:
Number of treatments done in the period November 2011.
Number of people working in shifts between 00:01 and 08:00 hours.
I have two tables, which have the following attributes in them(among others):
Shift(day, month, year)
Treatment(start_time, date)
For the first table- Shift, query results need to return values in
terms of (ex: December 30,2012)
For the second table, start_time needs to have values like 0001 and
0800(as I mentioned above). While, date can return values like
'November 2011'.
Initially I thought using the date datatype for declaring each of the day/month/year/date variables would do the job. But this doesn't seem to work out. Should I use int, varchar and int respectively for day, month and year respectively? Also, since the date variable does not have component parts, will date datatype work here? Lastly, if I use timestamp data type for the start_time attribute, what should be the value I enter in the insert column- should it be 08:00:00?
I'm using SQL Server 2014.
Thank You for your help.
AFAIK it is better to use one column by type of DateTime instead of two columns which hold Date and Time separately.
Also you could simply query this column either by Date or Time by casting it to corresponding type :
DECLARE #ChangeDateTime AS DATETIME = '2012-12-09 16:07:43.937'
SELECT CAST(#ChangeDateTime AS DATE) AS [ChangeDate],
CAST(#ChangeDateTime AS TIME) AS [ChangeTime]
results to :
ChangeDate ChangeTime
---------- ----------------
2012-12-09 16:07:43.9370000