SELECT datediff"d",date1,date2 AS days FROM SELECT pubdate as date1 FROM titles WHERE title_id = 'T05' t1, SELECT pubdate as date2 FROM titles WHERE title_id = 'T06' t2; -- Count the mon
Trang 1Microsoft Access
Access metadata are available graphically
through the Design View of each database
object and programmatically through the
Visual Basic for Applications (VBA) or C#
language Access also creates and maintains
hidden system tables in each database
To show system tables:
◆ In Access 2003 or earlier, choose Tools >
Options > View tab > check System
Objects.
or
In Access 2007 or later, choose Microsoft
Office button > Access Options >
Current Database (in the left pane) >
scroll to Navigation > click Navigation
Options > check Show System Objects.
The system tables begin with MSys and are
commingled with the database’s other
tables You can open and query them as you
would ordinary tables The most interesting
system table is MSysObjects , which catalogs
all the objects in the database Listing 15.39
lists all the tables in the current database.
Note that system tables don’t have to be
visi-ble to be used in queries.
Microsoft SQL Server
SQL Server metadata are available through
the schema INFORMATION_SCHEMA and via
sys-tem stored procedures (Listing 15.40).
440
Listing 15.39 List the tables in the current Access
database To list queries instead, change Type = 1to
Type = 5.
SELECT Name FROM MSysObjects WHERE Type = 1;
Listing
Listing 15.40 Metadata statements and commands
for Microsoft SQL Server.
List the databases
exec sp_helpdb;
List the schemas
SELECT schema_name FROM information_schema.schemata;
List the tables (Method 1)
SELECT * FROM information_schema.tables WHERE table_type = 'BASE TABLE'
AND table_schema = 'schema_name';
List the tables (Method 2)
exec sp_tables;
Describe a table (Method 1)
SELECT * FROM information_schema.columns
WHERE table_catalog = 'db_name' AND table_schema = 'schema_name' AND table_name = 'table_name';
Describe a table (Method 2)
exec sp_help table_name;
Listing
Trang 2Oracle metadata are available through data dictionary views and via sqlplus
(Listing 15.41) To list data dictionary
views, run this query in sqlplus : SELECT table_name, comments FROM dictionary
ORDER BY table_name;
For a list of Oracle databases (instances) in Unix or Linux, look in the file oratab located
in the directory /etc or /var/opt/oracle
In Windows, run this command at a com-mand prompt:
net start | find /i "OracleService"
Or choose Start > Run (Windows logo key+R), type services.msc , press Enter, and then inspect the Services list for entries that
begin with OracleService.
441
Listing 15.41 Metadata statements and commands
for Oracle.
List the schemas (users)
SELECT *
FROM all_users;
List the tables
SELECT table_name
FROM all_tables
WHERE owner = 'user_name';
Describe a table (Method 1)
SELECT *
FROM all_tab_columns
WHERE owner = 'user_name'
AND table_name = 'table_name';
Describe a table (Method 2, in sqlplus)
DESCRIBE table_name;
Listing
Trang 3IBM DB2
DB2 metadata are available through the
system catalog SYSCAT and via db2
(Listing 15.42).
442
Listing 15.42 Metadata statements and commands
for IBM DB2.
List the databases (in db2)
LIST DATABASE DIRECTORY;
List the schemas
SELECT schemaname FROM syscat.schemata;
List the tables (Method 1)
SELECT tabname FROM syscat.tables
WHERE tabschema = 'schema_name';
List the tables (Method 2, in db2) LIST TABLES;
List the tables (Method 3, in db2)
LIST TABLES FOR SCHEMA schema_name;
Describe a table (Method 1)
SELECT * FROM syscat.columns
WHERE tabname = 'table_name' AND tabschema = 'schema_name';
Describe a table (Method 2, in db2)
DESCRIBE TABLE table_name SHOW DETAIL;
Listing
Trang 4MySQL metadata are available through the schema INFORMATION_SCHEMA and via mysql
(Listing 15.43).
443
Listing 15.43 Metadata statements and commands for
MySQL.
List the databases (Method 1)
SELECT schema_name
FROM information_schema.schemata;
List the databases (Method 2, in mysql)
SHOW DATABASES;
List the tables (Method 1)
SELECT table_name
FROM information_schema.tables
WHERE table_schema = 'db_name';
List the tables (Method 2, in mysql)
SHOW TABLES;
Describe a table (Method 1)
SELECT *
FROM information_schema.columns
WHERE table_schema = 'db_name'
AND table_name = 'table_name';
Describe a table (Method 2, in mysql)
DESCRIBE table_name;
Listing
Trang 5PostgreSQL metadata are available through
the schema INFORMATION_SCHEMA and via
psql (Listing 15.44).
444
Listing 15.44 Metadata statements and commands
for PostgreSQL.
List the databases (Method 1)
psql list
List the databases (Method 2, in psql)
\l
List the schemas
SELECT schema_name FROM information_schema.schemata;
List the tables (Method 1)
SELECT table_name FROM information_schema.tables
WHERE table_schema = 'schema_name';
List the tables (Method 2, in psql)
\dt
Describe a table (Method 1)
SELECT * FROM information_schema.columns
WHERE table_schema = 'schema_name' AND table_name = 'table_name';
Describe a table (Method 2, in psql)
\d table_name;
Listing
Trang 6Working with Dates
As pointed out in “Getting the Current Date and Time” and “Performing Datetime and Interval Arithmetic” in Chapter 5, DBMSs provide their own extended (nonstandard) functions for manipulating dates and times This section explains how to use these
built-in functions to do simple date arithmetic.
The queries in each listing:
◆ Extract parts (hour, day, month, and so on) of the current (system) datetime and return them as numbers.
◆ Add and subtract intervals of days, months, and years from a date.
◆ Count the days between two dates in dif-ferent rows of the same column The result is positive, zero, or negative depending on whether the first date falls before, on, or after the second date.
◆ Count the months between the earliest and latest dates in the same column.
Microsoft Access
The function datepart() extracts the speci-fied part of a datetime now() returns the current (system) date and time dateadd() adds a specified time interval to a date.
datediff() returns the number of speci-fied time intervals between two dates
(Listing 15.45).
■ Alternatives to datepart() are the extraction functions second() , day() , month() , and so on.
445
Listing 15.45 Working with dates in Microsoft Access.
Extract parts of the current datetime
SELECT
datepart("s", now()) AS sec_pt,
datepart("n", now()) AS min_pt,
datepart("h", now()) AS hr_pt,
datepart("d", now()) AS day_pt,
datepart("m", now()) AS mon_pt,
datepart("yyyy",now()) AS yr_pt;
Add or subtract days, months, and years
SELECT
dateadd("d", 2,pubdate) AS p2d,
dateadd("d", -2,pubdate) AS m2d,
dateadd("m", 2,pubdate) AS p2m,
dateadd("m", -2,pubdate) AS m2m,
dateadd("yyyy", 2,pubdate) AS p2y,
dateadd("yyyy",-2,pubdate) AS m2y
FROM titles
WHERE title_id = 'T05';
Count the days between two dates
SELECT datediff("d",date1,date2) AS days
FROM
(SELECT pubdate as date1
FROM titles
WHERE title_id = 'T05') t1,
(SELECT pubdate as date2
FROM titles
WHERE title_id = 'T06') t2;
Count the months between two dates
SELECT datediff("m",date1,date2) AS months
FROM
(SELECT
MIN(pubdate) AS date1,
MAX(pubdate) AS date2
FROM titles) t1;
Listing
Trang 7Microsoft SQL Server
The function datepart() extracts the
speci-fied part of a datetime getdate() returns
the current (system) date and time.
dateadd() adds a specified time interval to a
date datediff() returns the number of
specified time intervals between two dates
(Listing 15.46).
■ Alternatives to datepart() are the
extraction functions day() , month() ,
and year()
446
Listing 15.46 Working with dates in Microsoft SQL
Server.
Extract parts of the current datetime SELECT
datepart("s", getdate()) AS sec_pt, datepart("n", getdate()) AS min_pt, datepart("hh", getdate()) AS hr_pt, datepart("d", getdate()) AS day_pt, datepart("m", getdate()) AS mon_pt, datepart("yyyy",getdate()) AS yr_pt;
Add or subtract days, months, and years SELECT
dateadd("d", 2,pubdate) AS p2d, dateadd("d", -2,pubdate) AS m2d, dateadd("m", 2,pubdate) AS p2m, dateadd("m", -2,pubdate) AS m2m, dateadd("yyyy", 2,pubdate) AS p2y, dateadd("yyyy",-2,pubdate) AS m2y FROM titles
WHERE title_id = 'T05';
Count the days between two dates SELECT datediff("d",date1,date2) AS days FROM
(SELECT pubdate as date1 FROM titles
WHERE title_id = 'T05') t1, (SELECT pubdate as date2 FROM titles
WHERE title_id = 'T06') t2;
Count the months between two dates SELECT datediff("m",date1,date2) AS months FROM
(SELECT MIN(pubdate) AS date1, MAX(pubdate) AS date2 FROM titles) t1;
Listing
Trang 8The function to_char() converts a datetime
to a character value in the given format.
to_number() converts its argument to a number sysdate returns the current (sys-tem) date and time The standard addition and subtraction operators add and subtract days from a date add_months() adds a speci-fied number of months to a date.
Subtracting one date from another yields the number of days between them.
months_between() returns the number of
months between two dates (Listing 15.47).
447
Listing 15.47 Working with dates in Oracle.
Extract parts of the current datetime
SELECT
to_number(to_char(sysdate,'ss'))
AS sec_pt,
to_number(to_char(sysdate,'mi'))
AS min_pt,
to_number(to_char(sysdate,'hh24'))
AS hr_pt,
to_number(to_char(sysdate,'dd'))
AS day_pt,
to_number(to_char(sysdate,'mm'))
AS mon_pt,
to_number(to_char(sysdate,'yyyy'))
AS yr_pt
FROM dual;
Add or subtract days, months, and years
SELECT
pubdate+2 AS p2d,
pubdate-2 AS m2d,
add_months(pubdate,+2) AS p2m,
add_months(pubdate,-2) AS m2m,
add_months(pubdate,+24) AS p2y,
add_months(pubdate,-24) AS m2y
FROM titles
WHERE title_id = 'T05';
Count the days between two dates
SELECT date2 - date1 AS days
FROM
(SELECT pubdate as date1
FROM titles
WHERE title_id = 'T05') t1,
(SELECT pubdate as date2
FROM titles
WHERE title_id = 'T06') t2;
Count the months between two dates
SELECT months_between(date2,date1) AS months
FROM
(SELECT
MIN(pubdate) AS date1,
MAX(pubdate) AS date2
FROM titles) t1;
Listing
Trang 9IBM DB2
The functions second() , day() , month() ,
and so on, extract part of a datetime
current_timestamp returns the current
(system) date and time The standard
addition and subtraction operators add
and subtract time intervals from a date.
days() converts a date to an integer serial
number (Listing 15.48).
448
Listing 15.48 Working with dates in IBM DB2.
Extract parts of the current datetime SELECT
second(current_timestamp) AS sec_pt, minute(current_timestamp) AS min_pt, hour(current_timestamp) AS hr_pt, day(current_timestamp) AS day_pt, month(current_timestamp) AS mon_pt, year(current_timestamp) AS yr_pt FROM SYSIBM.SYSDUMMY1;
Add or subtract days, months, and years SELECT
pubdate + 2 DAY AS p2d, pubdate - 2 DAY AS m2d, pubdate + 2 MONTH AS p2m, pubdate - 2 MONTH AS m2m, pubdate + 2 YEAR AS p2y, pubdate - 2 YEAR AS m2y FROM titles
WHERE title_id = 'T05';
Count the days between two dates SELECT days(date2) - days(date1) AS days FROM
(SELECT pubdate as date1 FROM titles
WHERE title_id = 'T05') t1, (SELECT pubdate as date2 FROM titles
WHERE title_id = 'T06') t2;
Count the months between two dates SELECT
(year(date2)*12 + month(date2)) -(year(date1)*12 + month(date1))
AS months FROM
(SELECT MIN(pubdate) AS date1, MAX(pubdate) AS date2 FROM titles) t1;
Listing
Trang 10The function date_format() formats a datetime according to the specified format.
current_timestamp returns the current (system) date and time The standard addi-tion and subtracaddi-tion operators add and sub-tract time intervals from a date datediff() returns the number of days between two
dates (Listing 15.49).
■ Alternatives to date_format() are the extraction functions extract() , second() , day() , month() , and so on.
449
Listing 15.49 Working with dates in MySQL.
Extract parts of the current datetime
SELECT
date_format(current_timestamp,'%s')
AS sec_pt,
date_format(current_timestamp,'%i')
AS min_pt,
date_format(current_timestamp,'%k')
AS hr_pt,
date_format(current_timestamp,'%d')
AS day_pt,
date_format(current_timestamp,'%m')
AS mon_pt,
date_format(current_timestamp,'%Y')
AS yr_pt;
Add or subtract days, months, and years
SELECT
pubdate + INTERVAL 2 DAY AS p2d,
pubdate - INTERVAL 2 DAY AS m2d,
pubdate + INTERVAL 2 MONTH AS p2m,
pubdate - INTERVAL 2 MONTH AS m2m,
pubdate + INTERVAL 2 YEAR AS p2y,
pubdate - INTERVAL 2 YEAR AS m2y
FROM titles
WHERE title_id = 'T05';
Count the days between two dates
SELECT datediff(date2,date1) AS days
FROM
(SELECT pubdate as date1
FROM titles
WHERE title_id = 'T05') t1,
(SELECT pubdate as date2
FROM titles
WHERE title_id = 'T06') t2;
Count the months between two dates
SELECT
(year(date2)*12 + month(date2))
-(year(date1)*12 + month(date1))
AS months
FROM
(SELECT
MIN(pubdate) AS date1,
MAX(pubdate) AS date2
FROM titles) t1;
Listing