Many Date Format Options with SQL
--Microsoft SQL Server T-SQL date and datetime formats
--Date time formats -- mssql datetime
--MSSQL getdate returns current system date and time in standard internal format
SELECT CONVERT (varchar, getdate(), 100) -- mon dd yyyy hh:mmAM (or PM)
-- Oct 2 2008 11:01AM
SELECT CONVERT (varchar, getdate(), 101) -- mm/dd/yyyy - 10/02/2008
SELECT CONVERT (varchar, getdate(), 102) -- yyyy.mm.dd -- 2008.10.02
SELECT CONVERT (varchar, getdate(), 103) -- dd/mm/yyyy
SELECT CONVERT (varchar, getdate(), 104) -- dd.mm.yyyy
SELECT CONVERT (varchar, getdate(), 105) -- dd-mm-yyyy
SELECT CONVERT (varchar, getdate(), 106) -- dd mon yyyy
SELECT CONVERT (varchar, getdate(), 107) -- mon dd, yyyy
SELECT CONVERT (varchar, getdate(), 108) -- hh:mm:ss
SELECT CONVERT (varchar, getdate(), 109) -- mon dd yyyy hh:mm:ss:mmmAM (or PM)
-- Oct 2 2008 11:02:44:013AM
SELECT CONVERT (varchar, getdate(), 110) -- mm-dd-yyyy
SELECT CONVERT (varchar, getdate(), 111) -- yyyy/mm/dd
SELECT CONVERT (varchar, getdate(), 112) -- yyyymmdd
SELECT CONVERT (varchar, getdate(), 113) -- dd mon yyyy hh:mm:ss:mmm
-- 02 Oct 2008 11:02:07:577
SELECT CONVERT (varchar, getdate(), 114) -- hh:mm:ss:mmm(24h)
SELECT CONVERT (varchar, getdate(), 120) -- yyyy-mm-dd hh:mm:ss(24h)
SELECT CONVERT (varchar, getdate(), 121) -- yyyy-mm-dd hh:mm:ss.mmm
SELECT CONVERT (varchar, getdate(), 126) -- yyyy-mm-ddThh:mm:ss.mmm
-- 2008-10-02T10:52:47.513
-- SQL create different date styles with t-sql string functions
SELECT replace( CONVERT (varchar, getdate(), 111), ‘ / ’, ‘ ‘) -- yyyy mm dd
SELECT CONVERT (varchar(7), getdate(), 126) -- yyyy-mm
SELECT RIGHT ( CONVERT (varchar, getdate(), 106), 8) -- mon yyyy
----
-- SQL Server date formatting function -- convert datetime to string
----
-- SQL datetime functions
-- SQL Server date formats
-- T-SQL convert dates
-- Formatting dates sql server
CREATE FUNCTION dbo.fnFormatDate (@Datetime DATETIME, @FormatMask VARCHAR(32))
RETURNS VARCHAR(32)
AS
BEGIN
DECLARE @StringDate VARCHAR(32)
SET @StringDate = @FormatMask
IF (CHARINDEX (‘YYYY’,@StringDate) > 0)
SET @StringDate = REPLACE(@StringDate, ‘YYYY’,
DATENAME(YY, @Datetime))
IF (CHARINDEX (‘YY’,@StringDate) > 0)
SET @StringDate = REPLACE(@StringDate, ‘YY’,
RIGHT (DATENAME(YY, @Datetime),2))
IF (CHARINDEX (‘ MONTH ’,@StringDate) > 0)
SET @StringDate = REPLACE(@StringDate, ‘ MONTH ’,
DATENAME(MM, @Datetime))
IF (CHARINDEX (‘MON’,@StringDate COLLATE SQL_Latin1_General_CP1_CS_AS) > 0)
SET @StringDate = REPLACE(@StringDate, ‘MON’,
LEFT ( UPPER (DATENAME(MM, @Datetime)),3))
IF (CHARINDEX (‘Mon’,@StringDate) > 0)
SET @StringDate = REPLACE(@StringDate, ‘Mon’,
LEFT (DATENAME(MM, @Datetime),3))
IF (CHARINDEX (‘MM’,@StringDate) > 0)
SET @StringDate = REPLACE(@StringDate, ‘MM’,
RIGHT (’0 '+CONVERT(VARCHAR,DATEPART(MM, @Datetime)),2))
IF (CHARINDEX (‘M’,@StringDate) > 0)
SET @StringDate = REPLACE(@StringDate, ‘M’,
CONVERT (VARCHAR,DATEPART(MM, @Datetime)))
IF (CHARINDEX (‘DD’,@StringDate) > 0)
SET @StringDate = REPLACE(@StringDate, ‘DD’,
RIGHT (’0 '+DATENAME(DD, @Datetime),2))
IF (CHARINDEX (‘D’,@StringDate) > 0)
SET @StringDate = REPLACE(@StringDate, ‘D’,
DATENAME(DD, @Datetime))
RETURN @StringDate
END
GO
-- Microsoft SQL Server date format function test
-- MSSQL formatting dates
SELECT dbo.fnFormatDate (getdate(), ‘MM / DD / YYYY’) -- 01/03/2012
SELECT dbo.fnFormatDate (getdate(), ‘DD / MM / YYYY’) -- 03/01/2012
SELECT dbo.fnFormatDate (getdate(), ‘M / DD / YYYY’) -- 1/03/2012
SELECT dbo.fnFormatDate (getdate(), ‘M / D / YYYY’) -- 1/3/2012
SELECT dbo.fnFormatDate (getdate(), ‘M / D / YY’) -- 1/3/12
SELECT dbo.fnFormatDate (getdate(), ‘MM / DD / YY’) -- 01/03/12
SELECT dbo.fnFormatDate (getdate(), ‘MON DD, YYYY’) -- JAN 03, 2012
SELECT dbo.fnFormatDate (getdate(), ‘Mon DD, YYYY’) -- Jan 03, 2012
SELECT dbo.fnFormatDate (getdate(), ‘ MONTH DD, YYYY’) -- January 03, 2012
SELECT dbo.fnFormatDate (getdate(), ‘YYYY / MM / DD’) -- 2012/01/03
SELECT dbo.fnFormatDate (getdate(), ‘YYYYMMDD’) -- 20120103
SELECT dbo.fnFormatDate (getdate(), ‘YYYY - MM - DD’) -- 2012-01-03
-- CURRENT_TIMESTAMP returns current system date and time in standard internal format
SELECT dbo.fnFormatDate (CURRENT_TIMESTAMP,‘YY.MM.DD’) -- 12.01.03
GO
----
/***** SELECTED SQL DATE/DATETIME FORMATS WITH NAMES *****/
-- SQL format datetime
-- Default format: Oct 23 2006 10:40AM
SELECT [ DEFAULT ] = CONVERT (varchar,GETDATE(),100)
-- US-Style format: 10/23/2006
SELECT [US - Style] = CONVERT ( CHAR ,GETDATE(),101)
-- ANSI format: 2006.10.23
SELECT [ANSI] = CONVERT ( CHAR ,CURRENT_TIMESTAMP,102)
-- UK-Style format: 23/10/2006
SELECT [UK - Style] = CONVERT ( CHAR ,GETDATE(),103)
-- German format: 23.10.2006
SELECT [German] = CONVERT (varchar,GETDATE(),104)
-- ISO format: 20061023
SELECT ISO = CONVERT (varchar,GETDATE(),112)
-- ISO8601 format: 2008-10-23T19:20:16.003
SELECT [ISO8601] = CONVERT (varchar,GETDATE(),126)
----
-- SQL Server datetime formats
-- Century date format MM/DD/YYYY usage in a query
-- Format dates SQL Server 2005
SELECT TOP (1)
SalesOrderID,
OrderDate = CONVERT ( CHAR (10), OrderDate, 101),
OrderDateTime = OrderDate
FROM AdventureWorks.Sales.SalesOrderHeader
/* Result
SalesOrderID OrderDate OrderDateTime
43697 07/01/2001 2001-07-01 00:00:00.000
*/
-- SQL update datetime column
-- SQL datetime DATEADD
UPDATE Production.Product
SET ModifiedDate = DATEADD(dd,1, ModifiedDate)
WHERE ProductID = 1001
-- MM/DD/YY date format
-- Datetime format sql
SELECT TOP (1)
SalesOrderID,
OrderDate = CONVERT (varchar(8), OrderDate, 1),
OrderDateTime = OrderDate
FROM AdventureWorks.Sales.SalesOrderHeader
ORDER BY SalesOrderID DESC
/* Result
SalesOrderID OrderDate OrderDateTime
75123 07/31/04 2004-07-31 00:00:00.000
*/
-- Combining different style formats for date & time
-- Datetime formats
-- Datetime formats sql
DECLARE @ DATE DATETIME
SET @ DATE = ’2015 - 12 - 22 03:51 PM’
SELECT CONVERT ( CHAR (10),@ DATE ,110) + SUBSTRING ( CONVERT (varchar,@ DATE ,0),12,8)
-- Result: 12-22-2015 3:51PM
-- Microsoft SQL Server cast datetime to string
SELECT stringDateTime = CAST (getdate() AS varchar)
-- Result: Dec 29 2012 3:47AM
----
-- SQL Server date and time functions overview
----
-- SQL Server CURRENT_TIMESTAMP function
-- SQL Server datetime functions
-- local NYC -- EST -- Eastern Standard Time zone
-- SQL DATEADD function -- SQL DATEDIFF function
SELECT CURRENT_TIMESTAMP -- 2012-01-05 07:02:10.577
-- SQL Server DATEADD function
SELECT DATEADD( MONTH ,2,’2012 - 12 - 09 ') -- 2013-02-09 00:00:00.000
-- SQL Server DATEDIFF function
SELECT DATEDIFF( DAY ,’2012 - 12 - 09 ',’2013-02-09' ) -- 62
-- SQL Server DATENAME function
SELECT DATENAME( MONTH , ’2012 - 12 - 09 ') -- December
SELECT DATENAME(weekday, ’2012 - 12 - 09 ') -- Sunday
-- SQL Server DATEPART function
SELECT DATEPART( MONTH , ’2012 - 12 - 09 ') -- 12
-- SQL Server DAY function
SELECT DAY (’2012 - 12 - 09 ') -- 9
-- SQL Server GETDATE function
-- local NYC -- EST -- Eastern Standard Time zone
SELECT GETDATE() -- 2012-01-05 07:02:10.577
-- SQL Server GETUTCDATE function
-- London -- Greenwich Mean Time
SELECT GETUTCDATE() -- 2012-01-05 12:02:10.577
-- SQL Server MONTH function
SELECT MONTH (’2012 - 12 - 09 ') -- 12
-- SQL Server YEAR function
SELECT YEAR (’2012 - 12 - 09 ') -- 2012
------
-- T-SQL Date and time function application
-- CURRENT_TIMESTAMP and getdate() are the same in T-SQL
------
-- SQL first day of the month
-- SQL first date of the month
-- SQL first day of current month -- 2012-01-01 00:00:00.000
SELECT DATEADD(dd,0,DATEADD(mm, DATEDIFF(mm,0,CURRENT_TIMESTAMP),0))
-- SQL last day of the month
-- SQL last date of the month
-- SQL last day of current month -- 2012-01-31 00:00:00.000
SELECT DATEADD(dd, - 1,DATEADD(mm, DATEDIFF(mm,0,CURRENT_TIMESTAMP) + 1,0))
-- SQL first day of last month
-- SQL first day of previous month -- 2011-12-01 00:00:00.000
SELECT DATEADD(mm, - 1,DATEADD(mm, DATEDIFF(mm,0,CURRENT_TIMESTAMP),0))
-- SQL last day of last month
-- SQL last day of previous month -- 2011-12-31 00:00:00.000
SELECT DATEADD(dd, - 1,DATEADD(mm, DATEDIFF(mm,0,DATEADD(MM, - 1,GETDATE())) + 1,0))
-- SQL first day of next month -- 2012-02-01 00:00:00.000
SELECT DATEADD(mm,1,DATEADD(mm, DATEDIFF(mm,0,CURRENT_TIMESTAMP),0))
-- SQL last day of next month -- 2012-02-28 00:00:00.000
SELECT DATEADD(dd, - 1,DATEADD(mm, DATEDIFF(mm,0,DATEADD(MM,1,GETDATE())) + 1,0))
GO
-- SQL first day of a month -- 2012-10-01 00:00:00.000
DECLARE @ DATE datetime; SET @ DATE = ’2012 - 10 - 23 '
SELECT DATEADD(dd,0,DATEADD(mm, DATEDIFF(mm,0,@ DATE ),0))
GO
-- SQL last day of a month -- 2012-03-31 00:00:00.000
DECLARE @ DATE datetime; SET @ DATE = ’2012 - 03 - 15 '
SELECT DATEADD(dd, - 1,DATEADD(mm, DATEDIFF(mm,0,@ DATE ) + 1,0))
GO
-- SQL first day of year
-- SQL first day of the year - 2012-01-01 00:00:00.000
SELECT DATEADD(yy, DATEDIFF(yy,0,CURRENT_TIMESTAMP), 0)
-- SQL last day of year
-- SQL last day of the year -- 2012-12-31 00:00:00.000
SELECT DATEADD(yy,1, DATEADD(dd, - 1, DATEADD(yy,
DATEDIFF(yy,0,CURRENT_TIMESTAMP), 0)))
-- SQL last day of last year
-- SQL last day of previous year -- 2011-12-31 00:00:00.000
SELECT DATEADD(dd, - 1,DATEADD(yy,DATEDIFF(yy,0,CURRENT_TIMESTAMP), 0))
GO
-- SQL calculate age in years, months, days
-- SQL table-valued function
-- SQL user-defined function -- UDF
-- SQL Server age calculation -- date difference
-- Format dates SQL Server 2008
USE AdventureWorks2008;
GO
CREATE FUNCTION fnAge (@BirthDate DATETIME)
RETURNS @Age TABLE (Years INT ,
Months INT ,
Days INT )
AS
BEGIN
DECLARE @EndDate DATETIME, @Anniversary DATETIME
SET @EndDate = Getdate()
SET @Anniversary = Dateadd(yy,Datediff(yy,@BirthDate,@EndDate),@BirthDate)
INSERT @Age
SELECT Datediff(yy,@BirthDate,@EndDate) - ( CASE
WHEN @Anniversary > @EndDate THEN 1
ELSE 0
END), 0, 0
UPDATE @Age SET Months = MONTH (@EndDate - @Anniversary) - 1
UPDATE @Age SET Days = DAY (@EndDate - @Anniversary) - 1
RETURN
END
GO
-- Test table-valued UDF
SELECT * FROM fnAge(’1956 - 10 - 23 ')
SELECT * FROM dbo.fnAge(’1956 - 10 - 23 ')
/* Results
Years Months Days
52 4 1
*/
----
-- SQL date range between
----
-- SQL between dates
USE AdventureWorks;
-- SQL between
SELECT POs = COUNT ( * ) FROM Purchasing.PurchaseOrderHeader
WHERE OrderDate BETWEEN ’20040301 ' AND ’20040315'
-- Result: 108
-- BETWEEN operator is equivalent to >=…AND….<=
SELECT POs = COUNT ( * ) FROM Purchasing.PurchaseOrderHeader
WHERE OrderDate
BETWEEN ’2004 - 03 - 01 00:00:00.000 ' AND ’2004-03-15 00:00:00.000'
/*
Orders with OrderDates
’2004-03-15 00:00:01.000' -- 1 second after midnight (12:00AM)
’2004-03-15 00:01:00.000' -- 1 minute after midnight
’2004-03-15 01:00:00.000' -- 1 hour after midnight
are not included in the two queries above.
*/
-- To include the entire day of 2004-03-15 use the following two solutions
SELECT POs = COUNT ( * ) FROM Purchasing.PurchaseOrderHeader
WHERE OrderDate >= ’20040301 ' AND OrderDate < ’20040316'
-- SQL between with DATE type (SQL Server 2008)
SELECT POs = COUNT ( * ) FROM Purchasing.PurchaseOrderHeader
WHERE CONVERT ( DATE , OrderDate) BETWEEN ’20040301 ' AND ’20040315'
------
-- Non-standard format conversion: 2011 December 14
-- SQL datetime to string
SELECT [YYYY MONTH DD] =
CAST ( YEAR (GETDATE()) AS VARCHAR(4)) + ‘ ‘ +
DATENAME(MM, GETDATE()) + ‘ ‘ +
CAST ( DAY (GETDATE()) AS VARCHAR(2))
-- Converting datetime to YYYYMMDDHHMMSS format: 20121214172638
SELECT replace( CONVERT (varchar, getdate(),111),‘ / ’,”) +
replace( CONVERT (varchar, getdate(),108),‘:’,”)
-- Datetime custom format conversion to YYYY_MM_DD
SELECT CurrentDate = rtrim( YEAR (getdate())) + ‘_’ +
RIGHT (’0 ' + rtrim(MONTH(getdate())),2) + ‘_’ +
RIGHT (’0 ' + rtrim(DAY(getdate())),2)
-- Converting seconds to HH:MM:SS format
DECLARE @Seconds INT
SET @Seconds = 10000
SELECT TimeSpan = RIGHT (’0 ' +rtrim(@Seconds / 3600),2) + ‘:’ +
RIGHT (’0 ' + rtrim((@Seconds % 3600) / 60),2) + ‘:’ +
RIGHT (’0 ' + rtrim(@Seconds % 60),2)
-- Result: 02:46:40
-- Test result
SELECT 2 * 3600 + 46 * 60 + 40
-- Result: 10000
-- Set the time portion of a datetime value to 00:00:00.000
-- SQL strip time from date
-- SQL strip time from datetime
SELECT CURRENT_TIMESTAMP ,DATEADD(dd, DATEDIFF(dd, 0, CURRENT_TIMESTAMP), 0)
-- Results: 2014-01-23 05:35:52.793 2014-01-23 00:00:00.000
/*******
VALID DATE RANGES FOR DATE/DATETIME DATA TYPES
SMALLDATETIME date range:
January 1, 1900 through June 6, 2079
DATETIME date range:
January 1, 1753 through December 31, 9999
DATETIME2 date range (SQL Server 2008):
January 1,1 AD through December 31, 9999 AD
DATE date range (SQL Server 2008):
January 1, 1 AD through December 31, 9999 AD
*******/
-- Selecting with CONVERT into different styles
-- Note: Only Japan & ISO styles can be used in ORDER BY
SELECT TOP(1)
Italy = CONVERT (varchar, OrderDate, 105)
, USA = CONVERT (varchar, OrderDate, 110)
, Japan = CONVERT (varchar, OrderDate, 111)
, ISO = CONVERT (varchar, OrderDate, 112)
FROM AdventureWorks.Purchasing.PurchaseOrderHeader
ORDER BY PurchaseOrderID DESC
/* Results
Italy USA Japan ISO
25-07-2004 07-25-2004 2004/07/25 20040725
*/
-- SQL Server convert date to integer
DECLARE @Datetime datetime
SET @Datetime = ’2012 - 10 - 23 10:21:05.345 '
SELECT DateAsInteger = CAST ( CONVERT (varchar,@Datetime,112) AS INT )
-- Result: 20121023
-- SQL Server convert integer to datetime
DECLARE @intDate INT
SET @intDate = 20120315
SELECT IntegerToDatetime = CAST ( CAST (@intDate AS varchar) AS datetime)
-- Result: 2012-03-15 00:00:00.000
------
-- SQL Server CONVERT script applying table INSERT/UPDATE
------
-- SQL Server convert date
-- Datetime column is converted into date only string column
USE tempdb;
GO
CREATE TABLE sqlConvertDateTime (
DatetimeCol datetime,
DateCol CHAR (8));
INSERT sqlConvertDateTime (DatetimeCol) SELECT GETDATE()
UPDATE sqlConvertDateTime
SET DateCol = CONVERT ( CHAR (10), DatetimeCol, 112)
SELECT * FROM sqlConvertDateTime
-- SQL Server convert datetime
-- The string date column is converted into datetime column
UPDATE sqlConvertDateTime
SET DatetimeCol = CONVERT (Datetime, DateCol, 112)
SELECT * FROM sqlConvertDateTime
-- Adding a day to the converted datetime column with DATEADD
UPDATE sqlConvertDateTime
SET DatetimeCol = DATEADD( DAY , 1, CONVERT (Datetime, DateCol, 112))
SELECT * FROM sqlConvertDateTime
-- Equivalent formulation
-- SQL Server cast datetime
UPDATE sqlConvertDateTime
SET DatetimeCol = DATEADD(dd, 1, CAST (DateCol AS datetime))
SELECT * FROM sqlConvertDateTime
GO
DROP TABLE sqlConvertDateTime
GO
/* First results
DatetimeCol DateCol
2014-12-25 16:04:15.373 20141225 */
/* Second results:
DatetimeCol DateCol
2014-12-25 00:00:00.000 20141225 */
/* Third results:
DatetimeCol DateCol
2014-12-26 00:00:00.000 20141225 */
------
-- SQL month sequence -- SQL date sequence generation with table variable
-- SQL Server cast string to datetime -- SQL Server cast datetime to string
-- SQL Server insert default values method
DECLARE @Sequence TABLE (Sequence INT IDENTITY (1,1))
DECLARE @i INT ; SET @i = 0
DECLARE @StartDate datetime;
SET @StartDate = CAST ( CONVERT (varchar, YEAR (getdate())) +
RIGHT (’0 '+CONVERT(varchar,MONTH(getdate())),2) + ’01' AS DATETIME)
WHILE ( @i < 120)
BEGIN
INSERT @Sequence DEFAULT VALUES
SET @i = @i + 1
END
SELECT MonthSequence = CAST (DATEADD( MONTH , Sequence,@StartDate) AS varchar)
FROM @Sequence
GO
/* Partial results:
MonthSequence
Jan 1 2012 12:00AM
Feb 1 2012 12:00AM
Mar 1 2012 12:00AM
Apr 1 2012 12:00AM
*/
------
------
-- SQL Server Server datetime internal storage
-- SQL Server datetime formats
------
-- SQL Server datetime to hex
SELECT Now = CURRENT_TIMESTAMP, HexNow = CAST (CURRENT_TIMESTAMP AS BINARY(8))
/* Results
Now HexNow
2009-01-02 17:35:59.297 0x00009B850122092D
*/
-- SQL Server date part -- left 4 bytes -- Days since 1900-01-01
SELECT Now = DATEADD( DAY , CONVERT ( INT , 0x00009B85), ’19000101 ')
GO
-- Result: 2009-01-02 00:00:00.000
-- SQL time part -- right 4 bytes -- milliseconds since midnight
-- 1000/300 is an adjustment factor
-- SQL dateadd to Midnight
SELECT Now = DATEADD(MS, (1000.0 / 300) * CONVERT (BIGINT, 0x0122092D), ’2009 - 01 - 02 ')
GO
-- Result: 2009-01-02 17:35:59.290
------
------
-- String date and datetime date&time columns usage
-- SQL Server datetime formats in tables
------
USE tempdb;
SET NOCOUNT ON ;
-- SQL Server select into table create
SELECT TOP (5)
FullName = CONVERT (nvarchar(50),FirstName + ‘ ‘ + LastName),
BirthDate = CONVERT ( CHAR (8), BirthDate,112),
ModifiedDate = getdate()
INTO Employee
FROM AdventureWorks.HumanResources.Employee e
INNER JOIN AdventureWorks.Person.Contact c
ON c.ContactID = e.ContactID
ORDER BY EmployeeID
GO
-- SQL Server alter table
ALTER TABLE Employee ALTER COLUMN FullName nvarchar(50) NOT NULL
GO
ALTER TABLE Employee
ADD CONSTRAINT [PK_Employee] PRIMARY KEY (FullName )
GO
/* Results
Table definition for the Employee table
Note: BirthDate is string date (only)
CREATE TABLE dbo.Employee(
FullName nvarchar(50) NOT NULL PRIMARY KEY,
BirthDate char(8) NULL,
ModifiedDate datetime NOT NULL
)
*/
SELECT * FROM Employee ORDER BY FullName
GO
/* Results
FullName BirthDate ModifiedDate
Guy Gilbert 19720515 2009-01-03 10:10:19.217
Kevin Brown 19770603 2009-01-03 10:10:19.217
Rob Walters 19650123 2009-01-03 10:10:19.217
Roberto Tamburello 19641213 2009-01-03 10:10:19.217
Thierry D’Hers 19490829 2009-01-03 10:10:19.217
*/
-- SQL Server age
SELECT FullName, Age = DATEDIFF( YEAR , BirthDate, GETDATE()),
RowMaintenanceDate = CAST (ModifiedDate AS varchar)
FROM Employee ORDER BY FullName
GO
/* Results
FullName Age RowMaintenanceDate
Guy Gilbert 37 Jan 3 2009 10:10AM
Kevin Brown 32 Jan 3 2009 10:10AM
Rob Walters 44 Jan 3 2009 10:10AM
Roberto Tamburello 45 Jan 3 2009 10:10AM
Thierry D’Hers 60 Jan 3 2009 10:10AM
*/
-- SQL Server age of Rob Walters on specific dates
-- SQL Server string to datetime implicit conversion with DATEADD
SELECT AGE50DATE = DATEADD(YY, 50, ’19650123 ')
GO
-- Result: 2015-01-23 00:00:00.000
-- SQL Server datetime to string, Italian format for ModifiedDate
-- SQL Server string to datetime implicit conversion with DATEDIFF
SELECT FullName,
AgeDEC31 = DATEDIFF( YEAR , BirthDate, ’20141231 '),
AgeJAN01 = DATEDIFF( YEAR , BirthDate, ’20150101 '),
AgeJAN23 = DATEDIFF( YEAR , BirthDate, ’20150123 '),
AgeJAN24 = DATEDIFF( YEAR , BirthDate, ’20150124 '),
ModDate = CONVERT (varchar, ModifiedDate, 105)
FROM Employee
WHERE FullName = ‘Rob Walters’
ORDER BY FullName
GO
/* Results
Important Note: age increments on Jan 1 (not as commonly calculated)
FullName AgeDEC31 AgeJAN01 AgeJAN23 AgeJAN24 ModDate
Rob Walters 49 50 50 50 03-01-2009
*/
------
-- SQL combine integer date & time into datetime
------
-- Datetime format sql
-- SQL stuff
DECLARE @DateTimeAsINT TABLE ( ID INT IDENTITY (1,1) PRIMARY KEY ,
DateAsINT INT ,
TimeAsINT INT
)
-- NOTE: leading zeroes in time is for readability only!
INSERT @DateTimeAsINT (DateAsINT, TimeAsINT) VALUES (20121023, 235959)
INSERT @DateTimeAsINT (DateAsINT, TimeAsINT) VALUES (20121023, 010204)
INSERT @DateTimeAsINT (DateAsINT, TimeAsINT) VALUES (20121023, 002350)
INSERT @DateTimeAsINT (DateAsINT, TimeAsINT) VALUES (20121023, 000244)
INSERT @DateTimeAsINT (DateAsINT, TimeAsINT) VALUES (20121023, 000050)
INSERT @DateTimeAsINT (DateAsINT, TimeAsINT) VALUES (20121023, 000006)
SELECT DateAsINT, TimeAsINT,
CONVERT (datetime, CONVERT (varchar(8), DateAsINT) + ‘ ‘ +
STUFF(STUFF ( RIGHT (REPLICATE(’0 ', 6) + CONVERT(varchar(6), TimeAsINT), 6),
3, 0, ‘:’), 6, 0, ‘:’)) AS DateTimeValue
FROM @DateTimeAsINT
ORDER BY ID
GO
/* Results
DateAsINT TimeAsINT DateTimeValue
20121023 235959 2012-10-23 23:59:59.000
20121023 10204 2012-10-23 01:02:04.000
20121023 2350 2012-10-23 00:23:50.000
20121023 244 2012-10-23 00:02:44.000
20121023 50 2012-10-23 00:00:50.000
20121023 6 2012-10-23 00:00:06.000
*/
------
-- SQL Server string to datetime, implicit conversion with assignment
UPDATE Employee SET ModifiedDate = ’20150123 '
WHERE FullName = ‘Rob Walters’
GO
SELECT ModifiedDate FROM Employee WHERE FullName = ‘Rob Walters’
GO
-- Result: 2015-01-23 00:00:00.000
/* SQL string date, assemble string date from datetime parts */
-- SQL Server cast string to datetime -- sql convert string date
-- SQL Server number to varchar conversion
-- SQL Server leading zeroes for month and day
-- SQL Server right string function
UPDATE Employee SET BirthDate =
CONVERT ( CHAR (4), YEAR ( CAST (’1965 - 01 - 23 ' AS DATETIME)))+
RIGHT (’0 '+CONVERT(varchar,MONTH(CAST(’1965-01-23' AS DATETIME))),2) +
RIGHT (’0 '+CONVERT(varchar,DAY(CAST(’1965-01-23' AS DATETIME))),2)
WHERE FullName = ‘Rob Walters’
GO
SELECT BirthDate FROM Employee WHERE FullName = ‘Rob Walters’
GO
-- Result: 19650123
-- Perform cleanup action
DROP TABLE Employee
-- SQL nocount
SET NOCOUNT OFF;
GO
------
------
-- sql isdate function
------
USE tempdb;
-- sql newid -- random sort
SELECT top(3) SalesOrderID,
stringOrderDate = CAST (OrderDate AS varchar)
INTO DateValidation
FROM AdventureWorks.Sales.SalesOrderHeader
ORDER BY NEWID()
GO
SELECT * FROM DateValidation
/* Results
SalesOrderID stringOrderDate
56720 Oct 26 2003 12:00AM
73737 Jun 25 2004 12:00AM
70573 May 14 2004 12:00AM
*/
-- SQL update with top
UPDATE TOP(1) DateValidation
SET stringOrderDate = ‘Apb 29 2004 12:00AM’
GO
-- SQL string to datetime fails without validation
SELECT SalesOrderID, OrderDate = CAST (stringOrderDate AS datetime)
FROM DateValidation
GO
/* Msg 242, Level 16, State 3, Line 1
The conversion of a varchar data type to a datetime data type resulted in an
out-of-range value.
*/
-- sql isdate -- filter for valid dates
SELECT SalesOrderID, OrderDate = CAST (stringOrderDate AS datetime)
FROM DateValidation
WHERE ISDATE(stringOrderDate) = 1
GO
/* Results
SalesOrderID OrderDate
73737 2004-06-25 00:00:00.000
70573 2004-05-14 00:00:00.000
*/
-- SQL drop table
DROP TABLE DateValidation
GO
------
-- SELECT between two specified dates -- assumption TIME part is 00:00:00.000
------
-- SQL datetime between
-- SQL select between two dates
SELECT EmployeeID, RateChangeDate
FROM AdventureWorks.HumanResources.EmployeePayHistory
WHERE RateChangeDate >= ’1997 - 11 - 01 ' AND
RateChangeDate < DATEADD(dd,1,’1998 - 01 - 05 ')
GO
/* Results
EmployeeID RateChangeDate
3 1997-12-12 00:00:00.000
4 1998-01-05 00:00:00.000
*/
/* Equivalent to
-- SQL datetime range
SELECT EmployeeID, RateChangeDate
FROM AdventureWorks.HumanResources.EmployeePayHistory
WHERE RateChangeDate >= ’1997-11-01 00:00:00' AND
RateChangeDate < ’1998-01-06 00:00:00'
GO
*/
------
-- SQL datetime language setting
-- SQL Nondeterministic function usage -- result varies with language settings
SET LANGUAGE ‘us_english’; ---- Jan 12 2015 12:00AM
SELECT US = CONVERT (VARCHAR, CONVERT (DATETIME,’01 / 12 / 2015 '));
SET LANGUAGE ‘British’; ---- Dec 1 2015 12:00AM
SELECT UK = CONVERT (VARCHAR, CONVERT (DATETIME,’01 / 12 / 2015 '));
SET LANGUAGE ‘German’; ---- Dez 1 2015 12:00AM
SET LANGUAGE ‘Deutsch’; ---- Dez 1 2015 12:00AM
SELECT Germany = CONVERT (VARCHAR, CONVERT (DATETIME,’01 / 12 / 2015 '));
SET LANGUAGE ‘French’; ---- déc 1 2015 12:00AM
SELECT France = CONVERT (VARCHAR, CONVERT (DATETIME,’01 / 12 / 2015 '));
SET LANGUAGE ‘Spanish’; ---- Dic 1 2015 12:00AM
SELECT Spain = CONVERT (VARCHAR, CONVERT (DATETIME,’01 / 12 / 2015 '));
SET LANGUAGE ‘Hungarian’; ---- jan 12 2015 12:00AM
SELECT Hungary = CONVERT (VARCHAR, CONVERT (DATETIME,’01 / 12 / 2015 '));
SET LANGUAGE ‘us_english’;
GO
------
------
-- Function for Monday dates calculation
------
USE AdventureWorks2008;
GO
-- SQL user-defined function
-- SQL scalar function -- UDF
CREATE FUNCTION fnMondayDate
(@ YEAR INT ,
@ MONTH INT ,
@MondayOrdinal INT )
RETURNS DATETIME
AS
BEGIN
DECLARE @FirstDayOfMonth CHAR (10),
@SeedDate CHAR (10)
SET @FirstDayOfMonth = CONVERT (VARCHAR,@ YEAR ) + ‘ - ’ + CONVERT (VARCHAR,@ MONTH ) + ‘ - 01 '
SET @SeedDate = ’1900 - 01 - 01 '
RETURN DATEADD(DD,DATEDIFF(DD,@SeedDate,DATEADD(DD,(@MondayOrdinal * 7) - 1,
@FirstDayOfMonth)) / 7 * 7, @SeedDate)
END
GO
-- Test Datetime UDF
-- Third Monday in Feb, 2015
SELECT dbo.fnMondayDate(2016,2,3)
-- 2015-02-16 00:00:00.000
-- First Monday of current month
SELECT dbo.fnMondayDate( YEAR (getdate()), MONTH (getdate()),1)
-- 2009-02-02 00:00:00.000